【问题标题】:Force .NET type to instantiate as COM强制 .NET 类型实例化为 COM
【发布时间】:2011-08-05 05:33:38
【问题描述】:

是否可以强制 COM Visible .NET 程序集实例化为 System.__ComObject,而不是 .NET 类型?我问的原因是,我的应用程序的一部分使用了第 3 方 COM 对象,但其中一些在用 .NET 编写时,会被实例化为它们的 .NET 类型并破坏我创建的对象处理程序。我无法控制用于创建 COM 对象的方法。目前我正在使用以下内容来创建对象。

Type comType = Type.GetTypeFromCLSID(objectGUID);
comObject = Activator.CreateInstance(comType);

谢谢!

【问题讨论】:

  • 你想对那些正在破坏的对象做什么?
  • 以COM接口/方法,IOleWindow为例。这些对象可能实现多个接口中的一个或多个,因此我正在检查该对象是否是这些接口之一。当实例化为 .NET 类型时,COM 接口没有通过检查。

标签: c# com


【解决方案1】:

其实没有。

托管对象的 COM 激活在与调用者相同的 AppDomain 中完成。恕我直言,这是 .NET 中 COM 互操作的一个令人讨厌的问题。这里有几个关于 SO 的问题,通过各种尝试来完成这项工作。我可以证明我已经尝试了大多数这些都无济于事。您的 COM API 提供者应该生成 PIA (Primary Interop Assembly) 以确保前向类型兼容性。如果不是,您将遇到一些令人讨厌的问题。

作为客户,我知道的唯一解决方法是仅使用“对象”类型。一切都需要经过反思。有些事情你还是做不到。例如,您将无法实现接口。

我不知道为什么会这样。为非托管和托管代码生成可行的 api 给我带来了无穷无尽的问题。

【讨论】:

  • 感谢您的信息。我担心会是这种情况,因为它符合我自己的研究,但我想在研究其他选择之前我会问。再次感谢。
猜你喜欢
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多