【问题标题】:Which Marshal::Copy overload method used?使用了哪个 Marshal::Copy 重载方法?
【发布时间】:2013-06-24 03:10:56
【问题描述】:

请考虑以下 C++/CLI 代码:

typedef unsigned __int8 uint8_t;
...
uint8_t          unmanaged_buf[MAVLINK_MAX_PACKET_LEN];
array<uint8_t>^  Buffer;
...
Marshal::Copy((IntPtr)unmanaged_buf, Buffer, 0, len);

下面是使用的 Marshal::Copy() 方法吗?

Marshal::Copy Method (IntPtr, array&lt;Byte&gt;, Int32, Int32)

PS:上述方法的MSDN URL在:http://msdn.microsoft.com/en-us/library/ms146631.aspx

如果是,是不是因为Byte是最接近unsigned __int8的类型?具体来说,Visual C++ 编译器如何确定使用哪个方法重载?

【问题讨论】:

    标签: c++-cli marshalling


    【解决方案1】:

    来自MSDN documentation about __int8

    __int8__int16__int32 类型是大小相同的 ANSI 类型的同义词,可用于编写跨多个平台行为相同的可移植代码。 __int8 数据类型与 char 类型同义,...

    这并没有说明 unsigned 版本的类型,但我认为假设 unsigned __int8unsigned char 的同义词是有道理的。

    来自.NET Framework Equivalents to C++ Native Types

    下表显示了内置 Visual C++ 类型的关键字,它们是 System 命名空间中预定义类型的别名。

    unsigned char:System.Byte

    综上所述,unsigned __int8System.Byte 的别名同义,这意味着它与 C++/CLI 代码中的 System.Byte 相同。

    【讨论】:

    • +1 谢谢,尤其是第二个(等效)链接。现在说得通了。
    • 第一个链接也不错,讲的是推广。谢谢。
    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多