C#字节数组和C ++字节数组之间的元素

时间:2013-07-17 00:27:13

标签: c# c++-cli

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

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

void testMethod(array<Byte>^ bytesFromCSharp);

并且在testMethod内部我想将bytesFromCSharp翻译成byte*,其他非托管C ++代码可以使用它。我对byte*数组进行了malloced并编写了一个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);
    ...
}

1 个答案:

答案 0 :(得分:5)

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

在pin_ptr&lt;&gt;之后,确保本机代码不再使用该数组。变量超出范围。这也意味着存储指针供以后使用的本机代码好。如果是,那么你来制作副本。