2015-01-27 78 views
0

有限定一个导入的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个不同的接口和不会将我的对象转换为另一个程序集中声明的接口。

我不能从第一个程序集中引用导入的接口,因为它没有被声明为公共的。我是否可以通过某种方式指示.Net运行时为我的托管对象创建一个RCW并隐藏实际的对象或者重写默认的投射行为?

我知道动态联编程序,但代码需要在.Net 2.0+上运行,所以很遗憾不是一个选项。

+0

我回答了类似的问题[这里](http://stackoverflow.com/a/26796534/1768303)。我相信该解决方案应该适用于.NET 2.0+。 – Noseratio 2015-01-27 05:31:23

回答

0

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

例如,你可以这样调用它:

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

这不起作用,因为这两个接口都是管理的接口。一种可行的方法是[this](http://stackoverflow.com/a/26796534/1768303)。 – Noseratio 2015-01-27 05:34:02

+0

我假设原始对象是一个实际的原生COM对象,而不是.NET对象。我也错过了他创建自己的托管类来实现界面的部分。如果它是真正的本地COM,则更简单的解决方案就是重新导入COM类型库并通过该对象创建COM对象(如果可能的话)。 – 2015-01-27 13:11:34

相关问题