我遇到了一个我认为与 CLR 与 COM 对象互操作的方式有关的问题,但我希望这里的一些人可以提供更多的见解。我想为这个问题的模糊性提前道歉,不幸的是我正在与一个有点不透明的系统集成。
考虑以下代码:
class Foo
{
private IComInterface comObject;
Foo(IServiceProvider provider)
{
this.comObject = serverProvider.GetService(typeof(ISomeService)) as IComInterface;
Debug.Assert(this.comObject != null); // comObject is *not* null here
}
void Bar()
{
IOtherComInterface otherInterface = this.comObject as IOtherComInterface;
Console.WriteLine(otherInterface == null);
}
}
COM 互操作类型嵌入在我的程序集中,该程序集由另一个程序作为插件加载。当我第一次创建 的实例时Foo
,服务提供者(由程序提供)提供的 COM 对象是非空的。但是,当我立即调用 时Bar()
,转换为IComOtherInterface
不起作用:该方法打印“true”。
不过,我的问题是,在加载了其他一些插件后,Bar()
再次调用会打印"false"。我已经验证它是同一个实例Foo
,实际上是同一个实例comObject
(我使用调试器用 ID 标记了两者,并且数字没有改变)。所以现在演员阵容成功了。
所以我的问题是:这怎么可能?是否有可能存储的对象comObject
实际上是通过同一个 RCW 第二次包装一个新的本机 COM 对象?加载其他程序集是否可能以某种方式改变了的类型标识,IOtherComInterface
以便演员现在可以工作?其他一些我实际上无法理解的疯狂可能性?