我有一个简单的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
谢谢!
答案 0 :(得分:2)
使用MTA线程中的STA对象需要编组。标准编组需要类型库。您获得的错误意味着无法加载类型库。
所以我猜想类型库没有正确注册。尝试取消注册并重新注册DLL,否则尝试使用REGTLB.exe直接注册类型库