C# COM互操作中的十进制封送

C# COM互操作中的十进制封送,c#,com-interop,C#,Com Interop,我有一个带有签名的COM对象方法 HRESULT _stdcall Method1([in] int ms); HRESULT_stdcall Method1([in]int-ms); 接下来,我通过反射从C#调用此方法: ... decimal ms = 100.5m; comType.InvokeMember("Method1", flags, null, comObject, new object[] { ms }); ... ... 十进制ms=100.5m; InvokeMemb

我有一个带有签名的COM对象方法

HRESULT _stdcall Method1([in] int ms); HRESULT_stdcall Method1([in]int-ms); 接下来,我通过反射从C#调用此方法:

... decimal ms = 100.5m; comType.InvokeMember("Method1", flags, null, comObject, new object[] { ms }); ... ... 十进制ms=100.5m; InvokeMember(“Method1”,标志,null,comObject,新对象[]{ms}); ... 这个电话对吗?我的意思是如何将十进制数ms封送到int

如果我通过Activator创建实例,则此代码有效

var comType= Type.GetTypeFromProgID("MyCom.Server", false); var comObject= Activator.CreateInstance(comType); var comType=Type.GetTypeFromProgID(“MyCom.Server”,false); var comObject=Activator.CreateInstance(comType);
谢谢

第一个代码段使用在向COM服务器添加引用时创建的运行时可调用包装器进行早期绑定调用。当参数类型为int时,传递一个十进制是不愉快的,反射不会为您转换参数值

第二个代码段使用IDispatch::Invoke()进行后期绑定调用。十进制数转换为VT_DEC类型的变量。然后COM服务器中的IDispatch实现将该变量转换为所需的参数类型。COM自动化助手函数VarI4FromDec()可能会做到这一点,这取决于服务器是自己实现IDispatch,还是由stock实现


因为您已经在使用RCW,所以这两个代码片段都没有多大意义。只需使用comObject.Method1(ms)。C#编译器将为您强制执行十进制。如果您喜欢使用后期绑定,速度慢但安全,那么您确实希望在C#version 4及更高版本中使用dynamic关键字。

您知道这是行不通的。您希望发生什么?它需要一个int,为什么您认为可以传递所有类型的十进制数?var comType=Type.GetTypeFromProgID(“MyCom.Server”,false);var comObject=Activator.CreateInstance(comType);对不起,我的意思是它起作用了。整数中不能包含小数。