从 .Net 传递到 COM 时,RCW 不转换整数
RCW does not convert integer when passing from .Net to COM
根据MSDN,关于 .Net 客户端到非托管对象之间 RCW 完成的类型转换,它是这样写的:
...Other types require no conversion. For instance, a standard wrapper will always pass a 4-byte integer between managed and unmanaged code without converting the type.
据我所知,
- Int32(.Net类型)表示32位有符号整数。
- 整数(VBA)表示16位有符号
因此,如果 Int32 作为参数从 .Net 传递到 VBA 方法并且 RCW 没有进行任何转换,那么如何传递参数?
重要的是如何在本机或托管代码端定义两个世界(非托管与托管)之间的转换。
如果转换是使用 COM / 自动化类型库(例如在 DLL 或 TLB 中)定义的,那么它将自动声明为相应的类型,尤其是对于非常知名的类型,例如无符号 16 位整数类型。
因此,VBA 16 位类型将被声明为等效的(如果它是标准的知名类型).NET 16 字节。例如,VBA integer
将被声明为 .NET 的 Int16
(类似于 C# 中的 short
关键字)。
如果手动定义转换,例如使用 .NET interface
和 COM 注释,那么开发人员的任务是确保声明对双方一致(或者 problems/bugs/crashes 可能发生)。
我建议官方文档中的两个链接:Default Marshaling Behavior and Blittable and Non-Blittable Types 以确定哪些可以被视为标准类型或众所周知的类型。
根据MSDN,关于 .Net 客户端到非托管对象之间 RCW 完成的类型转换,它是这样写的:
...Other types require no conversion. For instance, a standard wrapper will always pass a 4-byte integer between managed and unmanaged code without converting the type.
据我所知,
- Int32(.Net类型)表示32位有符号整数。
- 整数(VBA)表示16位有符号
因此,如果 Int32 作为参数从 .Net 传递到 VBA 方法并且 RCW 没有进行任何转换,那么如何传递参数?
重要的是如何在本机或托管代码端定义两个世界(非托管与托管)之间的转换。
如果转换是使用 COM / 自动化类型库(例如在 DLL 或 TLB 中)定义的,那么它将自动声明为相应的类型,尤其是对于非常知名的类型,例如无符号 16 位整数类型。
因此,VBA 16 位类型将被声明为等效的(如果它是标准的知名类型).NET 16 字节。例如,VBA integer
将被声明为 .NET 的 Int16
(类似于 C# 中的 short
关键字)。
如果手动定义转换,例如使用 .NET interface
和 COM 注释,那么开发人员的任务是确保声明对双方一致(或者 problems/bugs/crashes 可能发生)。
我建议官方文档中的两个链接:Default Marshaling Behavior and Blittable and Non-Blittable Types 以确定哪些可以被视为标准类型或众所周知的类型。