我有带签名的COM对象方法
HRESULT _stdcall Method1([in] int ms);
接下来,我通过反射从C#调用此方法:
... decimal ms = 100.5m; comType.InvokeMember("Method1", flags, null, comObject, new object[] { ms }); ...
这次通话是否正确?我的意思是如何将十进制 ms封送到 int ?
如果我通过Activator
创建实例,则此代码有效var comType= Type.GetTypeFromProgID("MyCom.Server", false); var comObject= Activator.CreateInstance(comType);
谢谢!
答案 0 :(得分:0)
第一个代码段使用在向COM服务器添加引用时创建的Runtime Callable Wrapper进行早期绑定调用。当参数类型为int时,它不会喜欢传递小数,Reflection不会为你转换参数值。
第二个片段使用IDispatch :: Invoke()进行后期绑定调用。十进制转换为VT_DEC类型的VARIANT。然后,COM服务器中的IDispatch实现将该变量转换为所需的参数类型。 COM自动化帮助程序函数VarI4FromDec()可能会这样做,取决于服务器是否实现了IDispatch本身,还是将其留给了库存实现。
由于您已经在使用RCW,因此两个代码段都没有多大意义。只需使用comObject.Method1(ms)。 C#编译器会为你强制小数。如果您喜欢使用后期绑定,但速度慢但安全,那么您真的希望在C#版本4及更高版本中支持 dynamic 关键字。