如何覆盖从托管对象到COM接口的转换?

时间:2015-01-27 00:27:18

标签: c# .net com

第三方.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个不同的接口,并且不将我的对象转换为在另一个程序集中声明的接口。

我无法从第一个程序集引用导入的接口,因为它未声明为public。我可以以某种方式指示.Net运行时为我的托管对象创建RCW并隐藏实际的RCW或以其他方式覆盖默认的转换行为吗?

我知道动态绑定器,但是代码需要在.Net 2.0+上运行,所以不幸的是它不是一个选项。

1 个答案:

答案 0 :(得分:0)

如果您使用.NET 2.0,最好的方法是使用反射从其他程序集中获取类型,然后使用Marshal.CreateWrapperOfType()。

例如,您可以这样称呼它:

var t1 = Type.GetType(assemblyQualifiedName);
object properlyTypedObj = System.Runtime.InteropServices.Marshal.CreateWrapperOfType(myobj, t1);