TYPE_E_CANTLOADLIBRARY - 通过MTA线程进行COM互操作

时间:2012-05-15 21:17:42

标签: c# com-interop

我有一个简单的x86目标.NET 3.5控制台程序,它通过互操作调用ActiveX DLL中的COM对象上的方法。在我的注册表中,ActiveX DLL有一个ThreadingModel of Apartment。当.NET程序在STA线程中运行时,一切正常。在MTA线程中,一些COM方法运行正常,其他人给我:

System.InvalidCastException:无法将类型为“MyComTypeClass”的COM对象强制转换为接口类型“_MyComType”。此操作失败,因为由于以下错误,对具有IID'{[ignored]}的接口的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 Exception - TYPE_E_CANTLOADLIBRARY?

TYPE_E_CANTLOADLIBRARY when using a COM object on a separate thread on Windows 2003 x64 only

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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