通过reflection在C#中转换System .__ ComObject
我正在尝试使用reflection将System.__ComObject
为接口类型。 我尝试过使用Convert.ChangeType(Object,Type)
但c#然后抛出此错误:
System.InvalidCastException:Object必须实现IConvertible。
那么是否有任何可能的方法将使用reflection的一般__ComObject
转换为正确的类型,以便我可以通过reflection调用它的方法? 是的,它必须通过一种方法来完成,该方法不涉及提前告诉编译器对象类型是什么!
一般来说,没有。
_ComObject需要实现.Net运行时知道的接口。 这将是您从QueryInterface
或IDispatch
获得的接口。
如果它是前者,您必须知道接口是什么,然后您必须使用接口上的ComImportAttribute描述.Net的接口。
如果COM对象实现了IDispatch
,则可以动态调用其上的成员。 在.Net 4.0及更高版本中,可以使用dynamic
关键字轻松完成此操作。 如果您使用的是早期版本的.Net,则可以在GetType()
返回的类型上调用InvokeMember()
,或者将其IReflect
为IReflect
并使用该接口调用方法。
最好的情况是,如果您获得COM对象的运行时可调用包装器(RCW),可以通过在COM库上自行运行tlbimp.exe
或tlbimp.exe
获取主互操作程序集(PIA),通常来自COM库作者。
对于要进行类型转换的任何对象,您需要确保它属于该特定类型。 您可以通过使用“is”运算符进行检查来validation这一点。 http://msdn.microsoft.com/en-us/library/scekt9xw%28VS.71%29.aspx