如何在 WCF 服务中引用 Com 对象

How To Reference a Com Object in a WCF Service

我需要从 Silverlight 程序中引用 Com DLL。由于这是不允许的,我创建了一个 wcf 服务并将我对 Com 的引用放在其中。 当我从本地计算机 运行 我的 wcf 服务时,这个想法似乎工作正常,但是当我将服务发布到我的服务器时,它无法工作。错误是“对象引用未设置到对象的实例”,我试图实例化 DLL。 这里的问题是 m_cloVB6Encryption = 新 VB6Encryption.cEncryption

VB6Encryption 是一个复杂的加密。它调用了另一个调用其他几个 DLL 的 DLL。

为了找出问题,我创建了一个非常简单的 VB6 组件,这次我得到了错误 "Retrieving the COM class factory for component with CLSID {74FE605A-5861-41A0-BA13-27DDD9C2EBB8} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))."

尽管我手动注册了组件并且注册成功了。

问题行是 cloSimple = New Simple.cSimple。

我的电脑运行Windows7;服务器运行 Windows Server 2012 R2 Standard。

推测您的 COM 组件构建为 32 位...因此当您注册时它被注册为 (InProc) 32 位 COM 组件....(并且只能由 32 位应用程序加载)。

您的 ASP.NET 网站很可能 运行 在设置为 64 位的 AppPool 中...因此它不能使用 32 位 COM class。

有2个选项(最清楚最简单的是选项1):

1) 将您的 IIS WebSite/Application 设置为 运行 32 位,以便它可以访问您已经注册的 32 位 COM 组件。

为确保您的网站也运行宁为 32 位(而不是 64 位)...更改 DefaultAppPool 以启用 32 位应用程序(或者您可以创建一个新的 AppPool,它是专门为此而设计的 32 位webservice/site 并让它使用它...如果您不想影响其他站点)。

2) 做一些额外的注册,这样你的 COM class 也可以用于 64 位客户端(你注册它所以它是 运行 OUT OF PROCESS ...所以它可以被使用32 位或 64 位客户端....但出于性能原因您可能不想要它...并且它可能并不总是可能的)