无法转换异常类型的COM对象我有如下代码:}这很好用。但是,如果我将代码更改为thread:privateIMyInterfacemyInterface;publicvoidTest(IMyInterfaceiInterface){myInterface=iInterface;newThread(newThreadStart(CallInterfaceMethod)).Start();}publicvoidCallInterfaceMethod(){myInterface.CallMethod()}当我使用线程时,出现异常:无法将类型为“System.__ComObject”的COM对象转换为接口类型“IMyInterface”。此操作失败,因为对具有IID“{GUID}”接口的COM组件的QueryInterface调用失败并出现以下错误:不支持此类接口,但应该支持接口就好了?有没有人对这里发生的事情有任何想法?这个令人讨厌的令人讨厌的异常是由于称为COM编组的概念而产生的。问题的实质是,为了从任何线程使用COM对象,线程必须能够访问描述COM对象的类型信息。在您描述的场景中,它在第二个线程上失败的原因是因为第二个线程没有接口的类型信息。您可以尝试将以下内容添加到您的代码中:[ComImport][Guid("23EB4AF8-BE9C-4b49-B3A4-24F4FF657B27")]publicinterfaceIMyInterface{voidCallMethod();基本上,上面的声明指示加载的.NETFrameworkCOM使用注册表中的传统技术加载类型信息,并从那里找到相关的类型库。您还应该将COM对象的创建限制为单个线程(以防止线程编组)以帮助解决此问题。总而言之,此错误围绕类型信息和线程编组。确保要访问COM对象的每个线程都具有有关从源线程解组对象的信息。PS:这个问题在.NET4.0中使用一种称为“类型等效”的技术得到了解决我得到了一个建议,它帮助了我!在主线程(Program.cs)中找到[STAThread]行并将其更改为[MTAThread]。我一直在开发一个通过COM接口使用7-zip的C#应用程序。我遇到了一件有趣的事情,我能够在一个实例中从工作线程中提取存档,但在另一个实例中却不能,得到了同样的异常。我发现只要在使用它的线程中初始化有问题的COM对象,就不会抛出异常。我的解决方案是使用COM接口处理对象并在线程之间传递它们时重新初始化它们。好吧,一方面,您在不锁定对象的情况下对对象进行跨线程调用,这会自动导致一些问题。您的代码应该更像:privateIMyInterfacemyInterface;私有静态只读对象_myObjectLock=newobject();publicvoidTest(IMyInterfaceiInterface){myInterface=iInterface;newThread(newThreadStart(CallInterfaceMethod)).Start();}publicvoidCallInterfaceMethod(){lock(_myObjectLock){myInterface.CallMethod();据我了解,您列出的错误有时会在无法访问资源时发生,这很可能会发生这种跨线程操作。不要引用我的话,我不是COM专家。老实说,我不认为我会这样调用这个方法,这样做的风险太大了。您是否考虑过使用ParameterizedThreadStart并以这种方式传递对象?跨线程操作还是需要安全锁定对象,但是会安全很多。此外,检查以确保您的“myInterface”类仍然可以调用“CallMethod()”方法。该接口没有实现,当您设置“myInterface=iInterface”时可能会遇到问题。以上就是C#学习教程的全部内容:无法转换异常类型的COM对象。如果对您有用,需要进一步了解C#学习教程,希望您多多关注。侵权请点击右侧联系管理员删除。如需转载请注明出处:
