带有 COM 库的 IIS 和 IISExpress

IIS and IISExpress with COM libraries

我的 Web 应用程序使用 COM 库,我使用此代码:

Type headType = Type.GetTypeFromProgID("Eapi.Head");
dynamic head = null;
head = Activator.CreateInstance(headType);

我对 IIS 的理解有一些问题。当我在 VisualStudio 中调试我的 webapp 时,运行 IISExpress 和所有工作。但是在 IIS 上发布项目后,应用程序找不到 COM 库。

HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)

IIS 在我开发项目的同一台计算机上。

我以两种方式注册这个 dll:

C:\WINDOWS\system32>regsvr32.exe c:\EOS\Delo\API\Eapi.dll
C:\WINDOWS\system32>cd ..
C:\Windows>cd SysWOW64
C:\Windows\SysWOW64>regsvr32.exe c:\EOS\Delo\API\Eapi.dll
C:\Windows\SysWOW64>

当谈到 0x80040154 REGDB_E_CLASSNOTREG 并且您确定您注册了 COM 服务器时,可能的问题是 32/64 位数不匹配。

无论您使用哪个 regsvr32,it would register in-process COM server with the bitness of the DLL

IIS 应用程序池有自己的位数设置,当两者不匹配时,您的进程内 COM 服务器将变得不可用。

典型的解决方案是为其他位数构建DLL并分别注册,或者更改IIS应用程序池位数以达到匹配,see instructions here: