我有一个简单的以 x86 为目标的 .NET 3.5 控制台程序,它通过互操作调用 ActiveX DLL 中的 COM 对象上的方法。在我的注册表中,ActiveX DLL 有一个 Apartment 的 ThreadingModel。当 .NET 程序在 STA 线程中运行时,一切正常。在 MTA 线程中,一些 COM 方法运行良好,其他的给我:
System.InvalidCastException:无法将“MyComTypeClass”类型的 COM 对象转换为接口类型“_MyComType”。此操作失败,因为 IID 为“{[省略]}”的接口的 COM 组件上的 QueryInterface 调用失败,原因是以下错误:加载类型库/DLL 时出错。(来自 HRESULT 的异常:0x80029C4A (TYPE_E_CANTLOADLIBRARY))。
如果我将 ActiveX DLL 的 ThreadingModel 切换为 Free 或 Both,.NET 程序在 MTA 线程中工作,但我想将 ThreadingModel 保留在 Apartment。
具有相同 ActiveX DLL 和互操作程序集的相同 .NET 程序在使用这两种线程模型的多台其他计算机(WinXP 32 位、Win7 64)上运行良好。该异常仅发生在一台 PC (Win7 64) 上,并且仅发生在 MTA 线程中。有谁知道为什么?
在没有解决方案的情况下提出了类似的问题,希望第三次是一个魅力:
COM 异常 - TYPE_E_CANTLOADLIBRARY?
TYPE_E_CANTLOADLIBRARY 仅在 Windows 2003 x64 上的单独线程上使用 COM 对象时
谢谢!