2

我有一个简单的以 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 对象时

谢谢!

4

1 回答 1

3

使用 MTA 线程中的 STA 对象需要编组。标准编组需要类型库。您收到的错误意味着无法加载类型库。

所以我猜想类型库没有正确注册。尝试注销并重新注册 DLL,否则尝试使用 REGTLB.exe 直接注册类型库

于 2012-05-15T21:44:08.767 回答