第三方.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+上运行,所以不幸的是它不是一个选项。
答案 0 :(得分:0)
如果您使用.NET 2.0,最好的方法是使用反射从其他程序集中获取类型,然后使用Marshal.CreateWrapperOfType()。
例如,您可以这样称呼它:
var t1 = Type.GetType(assemblyQualifiedName);
object properlyTypedObj = System.Runtime.InteropServices.Marshal.CreateWrapperOfType(myobj, t1);