COM-Interop中的十进制编组

时间:2013-04-05 10:35:26

标签: c# com-interop

我有带签名的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);

谢谢!

1 个答案:

答案 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 关键字。