我试图使用反射将System.__ComObject转换为接口类型。我尝试过使用Convert.ChangeType(Object,Type),但是c#随后抛出了这个错误:
System.InvalidCastException:对象必须实现IConvertible。
那么,有没有可能使用反射将通用__ComObject转换成正确的类型,这样我就可以通过反射调用它的方法了吗?是的,它必须通过一种方法来完成,这种方法不需要提前告诉编译器对象类型是什么!
发布于 2010-01-28 03:54:39
一般情况下,不。
_ComObject需要实现.Net运行时所知道的接口。这要么是从QueryInterface或IDispatch获得的接口。
如果是前者,则必须知道接口是什么,然后必须使用接口上的.Net描述接口。
如果COM对象实现了IDispatch,则可以在其上动态调用成员。在.Net 4.0和更高版本中,使用dynamic关键字可以很容易地做到这一点。如果您使用的是较早版本的.Net,则可以对GetType()返回的类型调用InvokeMember(),或者将其转换为IReflect,并使用该接口调用方法。
最好的情况是,如果您为COM对象获得了一个运行时可调用包装器(RCW),可以自己在COM库上运行tlbimp.exe,或者为它获取一个主互操作程序集(PIA),通常是从COM库作者那里获得。
发布于 2010-01-28 03:45:18
要使任何对象都是类型类型,您需要确保它属于该特定类型。您可以首先通过使用"is“操作符来验证这一点。http://msdn.microsoft.com/en-us/library/scekt9xw%28VS.71%29.aspx
https://stackoverflow.com/questions/2151861
复制相似问题