我有一个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);
...
}
答案 0 :(得分:5)
使用pin_ptr<> template class固定数组并生成本机代码可以使用的指针。固定它可确保在本机代码使用它时,垃圾收集器无法移动该数组。
在pin_ptr&lt;&gt;之后,确保本机代码不再使用该数组。变量超出范围。这也意味着存储指针供以后使用的本机代码不好。如果是,那么你有来制作副本。