从.Net传递到COM时,RCW不会转换整数

时间:2016-04-04 10:24:34

标签: .net com interop marshalling unmanaged

根据MSDN,关于RCW在.Net客户端与非托管对象之间完成的类型的转换,它写成:

  

......其他类型无需转换。例如,标准包装器将始终在托管代码和非托管代码之间传递4字节整数,而不转换类型。

AFAIK,

  • Int32(.Net type)表示32位有符号整数。
  • 整数(VBA)表示16位带符号

因此,如果Int32作为参数从.Net传递到VBA方法并且RCW没有完成转换,那么参数如何传递?

1 个答案:

答案 0 :(得分:1)

重要的是如何在本机或托管代码端的两个世界(非托管与托管)之间定义转换。

如果使用COM /自动化类型库(例如在DLL或TLB中)定义转换,则它将自动声明为相应的类型,尤其是对于非常有名的类型,例如无符号的16位整数类型。

因此,VBA 16位类型将被声明为等效的(如果它是标准的已知类型).NET 16字节。例如,VBA integer将被声明为.NET Int16(与C#中的short关键字一样)。

如果手动定义转换,例如使用带有COM注释的.NET interface,那么它是开发人员的任务,以确保声明对双方都是一致的(或者问题/错误) /可能发生崩溃。)

我建议官方文档中有两个链接:Default Marshaling BehaviorBlittable and Non-Blittable Types,以确定可以被视为标准或众所周知的类型。