我有以下代码:
public void Test(IMyInterface iInterface)
{
iInterface.CallMethod ( );
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.但是,如果我将代码更改为线程:
private IMyInterface myInterface;
public void Test(IMyInterface iInterface)
{
myInterface = iInterface;
new Thread ( new ThreadStart ( CallInterfaceMethod) ).Start ( );
}
public void CallInterfaceMethod ( )
{
myInterface.CallMethod ( )
}
Run Code Online (Sandbox Code Playgroud)
当我使用线程时,我收到异常:
无法将"System .__ ComObject"类型的COM对象强制转换为接口类型"IMyInterface".此操作失败,因为对于具有IID"{GUID}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口
但是应该支持接口就好了吗?有人对这里发生的事情有任何想法吗?
Mik*_*e J 21
由于称为COM编组的概念,这种令人讨厌的,令人讨厌的例外产生了.问题的实质在于,为了从任何线程使用COM对象,线程必须能够访问描述COM对象的类型信息.
在您描述的场景中,它在第二个线程上失败的原因是因为第二个线程没有该接口的类型信息.
您可以尝试在代码中添加以下内容:
[ComImport]
[Guid("23EB4AF8-BE9C-4b49-B3A4-24F4FF657B27")]
public interface IMyInterface
{
void CallMethod();
}
Run Code Online (Sandbox Code Playgroud)
基本上上面的声明指示.NET框架COM加载器使用注册表中的传统技术加载类型信息,并找到相关的类型库并从那里开始.
您还应该将COM对象的创建限制为单个线程(以防止线程编组)以帮助解决此问题.
总而言之,此错误围绕类型信息和线程编组.确保要访问COM对象的每个线程都具有从源线程解组对象的相关信息.
PS:使用称为"类型等价"的技术在.NET 4.0中解决了这个问题