C#Winform COM互操作和线程

C#Winform COM互操作和线程,c#,winforms,dll,com,interop,C#,Winforms,Dll,Com,Interop,我(再次)读了很多关于COM互操作性和线程的内容。现在,我在理解下面的场景时遇到了一些困难 我在VS2008中引用了一个名为ComDbLib的COM Dll,通过VS2008对象浏览器,我可以看到它有一个: 继承接口IComDb2、ComDb2、, IComDb 继承接口IComDb的公共接口IComDb2 继承接口IComDb2的公共接口ComDb2 公共接口IComDb 从MTA BGWorker线程调用创建ComDb2Class类型的新对象的方法(ComDb2Class objectD

我(再次)读了很多关于COM互操作性和线程的内容。现在,我在理解下面的场景时遇到了一些困难

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

  • 继承接口IComDb2、ComDb2、, IComDb
  • 继承接口IComDb的公共接口IComDb2
  • 继承接口IComDb2的公共接口ComDb2
  • 公共接口IComDb
从MTA BGWorker线程调用创建ComDb2Class类型的新对象的方法(
ComDb2Class objectDb=new ComDb2Class();
)失败,出现众所周知的异常:

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

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

从STA线程调用相同的方法,但不存在异常。无论如何,我想避免这种方法,因为每次我想调用这个方法时,我都需要创建一个新线程(对这个方法的调用会很多,而且这些调用在应用程序中不是本地化的,而是分散的),这种方法会耗费时间

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

我无法理解,对我来说,任何来自MTA线程的调用都会产生异常,因为COM将是STA,只能在STA线程中调用


Geezz我在这里迷路了:你能解释一下为什么类构造函数在第一种方法中失败了,而不是在最后一种方法中失败了吗?

你能把BGWorker线程改成STA吗?@pstrjds不,BGWorker线程是MTA,我可以在BGWorker中得到一个新的STA线程,并将方法调用委托给它,但正如我所说的,这有一个我不想要的开销……您是否连接到IBM的DB2?如果是这样,为什么不使用DB2.Net客户端库而不是COM接口?@pstrjds不,它不是IBM的DB2。