2013-07-17 116 views
1

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

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

void testMethod(array<Byte>^ bytesFromCSharp); 

testMethod我想的bytesFromCSharp翻译成可由其他非托管C++代码中使用的byte*的内部。我编写了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); 
    ... 
} 

回答

5

使用pin_ptr<> template class到引脚阵列和产生的指针本机代码可以使用。固定它可以确保当本机代码使用它时,垃圾收集器不能移动该数组。

只要在pin_ptr变量超出范围之后确保本机代码不能再使用该数组。这也意味着存储指针以供以后使用的本地代码是而不是好吧。如果是这样,那么你作出副本。