2013-07-17 163 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變量超出範圍之後確保本機代碼不能再使用該數組。這也意味着存儲指針以供以後使用的本地代碼是而不是好吧。如果是這樣,那麼你作出副本。