【问题标题】:How To Reference a Com Object in a WCF Service如何在 WCF 服务中引用 Com 对象
【发布时间】:2015-02-11 16:53:55
【问题描述】:

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

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

为了尝试隔离问题,我创建了一个非常简单的 VB6 组件,这次我得到了错误 “由于以下错误,检索具有 CLSID {74FE605A-5861-41A0-BA13-27DDD9C2EBB8} 的组件的 COM 类工厂失败:80040154 未注册类(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))。”

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

问题行是 cloSimple = New Simple.cSimple。

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

【问题讨论】:

    标签: wcf silverlight com


    【解决方案1】:

    大概您的 COM 组件是构建为 32 位的...所以当您注册它时,它会注册为 (InProc) 32 位 COM 组件...(并且只能由 32 位应用程序加载)。

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

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

    1) 让您的 IIS 网站/应用程序以 32 位运行,这样它就可以访问您已经注册的 32 位 COM 组件。

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

    2) 进行一些额外的注册,以便您的 COM 类也可用于 64 位客户端(您注册它,使其运行在进程外……因此它可以被 32 位或 64 位客户端使用……但是由于性能原因,您可能不希望这样做......而且可能并不总是可能的)

    【讨论】:

    • 我被其他优先事项分心了。我会尽快回复并尝试您的想法。谢谢
    • 我试过你的#1,它对我有用。写得好,清晰易懂。
    猜你喜欢
    • 2012-06-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多