C#Winform COM互操作和线程

时间:2012-02-03 15:38:21

标签: c# winforms dll com interop

我一直在阅读(再次)关于COM互操作性和线程的很多内容。那么,现在,我在理解以下情况时遇到了一些麻烦。

我在VS2008中引用了一个名为ComDbLib的COM Dll,并且通过VS2008对象浏览器,我可以看到它有一个:

  • 继承接口IComDb2,ComDb2的公共类ComDb2Class, IComDb;
  • 继承接口IComDb的公共接口IComDb;
  • 继承接口IComDb2的公共接口ComDb2;
  • 公共接口IComDb;

从MTA BGWorker线程调用创建ComDb2Class类型(ComDb2Class objectDb = new ComDb2Class();的新对象的方法的调用失败,并出现众所周知的异常:

«无法将'ComDb2Class'类型的COM对象转换为接口类型'IComDb2'。此操作失败,因为由于以下错误,IID“XXXXXXXX”接口的COM组件上的QueryInterface调用失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))。»。

我需要BGWorker,因此它必须是解决方案的一部分。

调用相同的方法但是从STA线程没有异常。无论如何,我想避免这种方法,因为每次我想调用这个方法时我都需要创建一个新线程(会有很多调用方法,这些调用没有本地化在aplication中的一个地方,而是通过它),这种方法成本高昂。

现在引起我兴趣的部分是,如果你从MTA BGWorker线程调用创建类型(IComDb objectDb = new ComDb2Class();)对象的方法,它不会给出任何异常!

我无法理解,对我而言,MTA线程的任何调用都会产生异常,因为COM会成为STA,只能在STA线程中调用。

Geezz我迷失在这里:你可以向我解释为什么第一种方法中的类构造函数失败而不是最后一种吗?

0 个答案:

没有答案