繁体   English   中英

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

[英]How to override casting from a managed object to a COM interface?

有一个第三方的.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并隐藏实际对象或以其他方式覆盖默认强制转换行为吗?

我知道动态绑定程序,但是代码需要在.Net 2.0+上运行,因此很遗憾,它不是一种选择。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM