通过反射在C#中转换System.__ComObject

5
我正在尝试使用反射将 System.__ComObject 强制转换为接口类型。我尝试使用 Convert.ChangeType(Object,Type),但是C#会抛出以下错误:

System.InvalidCastException: 对象必须实现 IConvertible 接口。

那么有没有可能使用反射将通用的 __ComObject 强制转换为正确的类型,以便我可以通过反射调用它的方法呢?是的,必须通过一种不需要提前告诉编译器对象类型的方法来完成!


我正在尝试将System.__ComObject强制转换为接口类型 - 你能解释一下为什么吗? - Mitch Wheat
如果您无法在代码中进行强制转换,那么使用Reflection稍后进行的可能性微乎其微。COM对象实现了定义良好的接口类型,这些类型在类型库中定义,您必须使用Tlbimp.exe导入。 - Hans Passant
谢谢大家。我试图进行强制转换,因为我调用的方法返回一个对象。我从一个未经类型化的 DLR 语言中调用该方法,因此我希望通过给它正确的类型来进行一次强制转换,然后稍后使用反射调用其上的方法。如果对象仍然是 __ComObject,则无法使用 object.getType。当然,我可以每次指定类型或存储类型,但这并不是问题的重点X) - Josh
2个回答

7
一般情况下是不行的。
_ComObject需要实现一个.Net运行时知道的接口。这可能是一个你从 QueryInterfaceIDispatch 获取的接口。
如果是前者,你必须知道接口是什么,然后使用接口上的 ComImportAttribute 将接口描述给 .Net。
如果COM对象实现了IDispatch,那么可以在其上动态调用成员。在 .Net 4.0 及以上版本中,可以通过使用dynamic关键字轻松完成此操作。如果您使用的是早期版本的 .Net,则可以在使用GetType()返回的类型上调用InvokeMember()或者转换为 IReflect 并使用该接口来调用方法。
最好的情况是你获得了一个COM对象的运行时可调用包装器(RCW),可以通过在COM库上自己运行tlbimp.exe或从COM库作者那里获取主要互操作程序集(PIA)来实现。请保留HTML标签。

-4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接