【发布时间】:2015-01-27 00:27:17
【问题描述】:
有一个 3rd-party .Net 程序集定义了一个导入的 COM 接口,从另一个 COM 对象获取一个对象并将其转换为导入的接口:
[ComImport, Guid(...), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IMyInterface
{
//...
}
void SomeMethod(object obj)
{
IMyInterface iface = obj as IMyInterface ;
if (iface == null)
throw("Cannot get IMyInterface");
}
方法是公共的,而导入的COM接口是内部的。如何创建自己的实现该 COM 接口的托管对象?在我的程序集中重新导入相同接口的明显解决方案不起作用:
[ComImport, Guid(...), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IMyInterface
{
//...
}
class MyClass : IMyInterface
{
}
SomeMethod(new MyClass());
尽管具有相同的 GUID 并被标记为 COM 接口,.Net 运行时将导入的接口视为 2 个不同的接口,并且不会将我的对象转换为在另一个程序集中声明的接口。
我无法从第一个程序集中引用导入的接口,因为它没有被声明为公共的。我能否以某种方式指示 .Net 运行时为我的托管对象创建 RCW 并隐藏实际的 RCW 或以其他方式覆盖默认转换行为?
我知道动态绑定器,但是代码需要在 .Net 2.0+ 上运行,所以很遗憾它不是一个选项。
【问题讨论】:
-
我回答了一个类似的问题here。我相信该解决方案应该适用于 .NET 2.0+。