C#字节数组和C ++字节阵列之间元帅(Marshal between C# byte array

2019-10-18 09:36发布

我有一个C# array<System::Byte>和我想,要转换为一个C ++ byte* 。 我怎样才能做到这一点? 我使用C ++ / CLR,因为它让我用托管/非托管代码在同一个项目。 我基本上写一个DLL,并做了一些方法,可以通过C#调用,但包含非托管C ++代码。

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

void testMethod(array<Byte>^ bytesFromCSharp);

和的内部testMethod我想的翻译bytesFromCSharpbyte*可以由其它非托管C ++代码中使用。 我malloced的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);
    ...
}

Answer 1:

使用pin_ptr <>模板类到引脚阵列和产生的指针本机代码可以使用。 钉扎它确保阵列不能被垃圾收集器,而本机代码在使用它移动。

只要确保本地代码不能使用数组pin_ptr <>变量之后再超出范围。 这也意味着,本机代码存储供以后使用指针是不行的。 如果确实如此,那么你必须做一个副本。



文章来源: Marshal between C# byte array and C++ byte array
标签: c# c++-cli