0

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

HRESULT _stdcall Method1([in] int ms);

接下来,我通过反射从 C# 调用此方法:

...

十进制毫秒 = 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);

谢谢!

4

1 回答 1

0

第一个片段使用在添加对 COM 服务器的引用时创建的 Runtime Callable Wrapper 进行早期绑定调用。当参数类型为 int 时,传递小数点不会让您享受,反射不会为您转换参数值。

第二个片段使用 IDispatch::Invoke() 进行后期绑定调用。十进制转换为 VT_DEC 类型的 VARIANT。COM 服务器中的 IDispatch 实现然后将该变体转换为所需的参数类型。COM 自动化辅助函数 VarI4FromDec() 可能会这样做,这取决于服务器是自己实现 IDispatch 还是将其留给库存实现。

由于您已经在使用 RCW,因此这两个代码片段都没有多大意义。只需使用 comObject.Method1(ms)。C# 编译器将为您强制转换小数点。如果您喜欢使用后期绑定,虽然缓慢但安全,那么您真的希望在 C# 版本 4 及更高版本中使用动态关键字。

于 2013-04-05T11:48:24.673 回答