【问题标题】:Marshal between C# byte array and C++ byte arrayC#字节数组和C++字节数组之间的封送
【发布时间】:2013-07-17 00:27:12
【问题描述】:

我有一个 C# array<System::Byte>,我希望将其转换为 C++ byte*。我怎样才能做到这一点?我正在使用 C++/CLR,因为它允许我在同一个项目中使用托管/非托管代码。我基本上是在编写一个 DLL 并制作一些可以通过 C# 调用的方法,但它们包含非托管 C++ 代码。

所以基本上,我的 C++/CLR 方法头是这样的:

void testMethod(array<Byte>^ bytesFromCSharp);

testMethod 内部,我想将bytesFromCSharp 翻译成byte*,其他非托管C++ 代码可以使用它。我分配了byte* 数组并编写了一个for循环来逐字节复制,但感觉应该有更好的解决方案。

编辑:汉斯的技术示例来自他的以下回答:

//C#
byte[] myBytes = {1,2,3,4};

//C++/CLI
void testMethod(array<byte>^ myBytes) {
    pin_ptr<byte> thePtr = &myBytes[0];
    byte* bPtr = thePtr;
    nativeCode(bPtr);
    ...
}

【问题讨论】:

    标签: c# c++-cli


    【解决方案1】:

    使用pin_ptr<> template class 固定数组并生成本机代码可以使用的指针。固定它可以确保在本机代码使用它时,垃圾收集器不会移动数组。

    只需确保在 pin_ptr 变量超出范围后,本机代码不能再使用该数组。这也意味着存储指针以供以后使用的本机代码可以。如果是,那么您必须制作一份副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多