【问题标题】:RCW does not convert integer when passing from .Net to COM从 .Net 传递到 COM 时,RCW 不转换整数
【发布时间】:2016-07-23 20:14:52
【问题描述】:

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

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

阿法伊克,

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

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

【问题讨论】:

    标签: .net com interop marshalling unmanaged


    【解决方案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,以确定哪些可以被视为标准类型或众所周知的类型。

    【讨论】:

    • 感谢@Simon Mourier 的解释。如果我理解正确,程序员有责任将 Int16 作为参数传递给整数的 VBA 方法?
    • 这取决于你如何定义接口方法,但如果它是手动完成的,那么是的,就像在那个问题中所做的那样:stackoverflow.com/questions/25134560/…(虽然它不是 COM,但它是相同的想法)
    • 感谢您的澄清
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多