2012-04-06 163 views
1

我無法弄清楚我的代碼在這裏出了什麼問題。這用於從我的非託管C++代碼創建數組fontNames,然後使用C#進行檢索。 C#代碼只是輸出一個空字符串數組。 (這對我使用相同方法的其他整數數組不是問題)。非託管char *數組託管System ::字符串託管C++

請注意,exportFontNames輸出的fontnames數組在這裏可以在C++中正常工作(它可以很好地打印)。

unsigned int fontNamesCount = 0; 
const char ** unmanagedFontNames = o.exportFontNames(fontNamesCount); 
array<String^>^ fontNames = gcnew array<String^>(fontNamesCount); 
for (unsigned int i = 0; i < fontNamesCount; i++) 
{ 
    fontNames[i] = gcnew String(unmanagedFontNames[i]); 
    delete [] unmanagedFontNames[i]; 
} 
delete [] unmanagedFontNames; 

任何人都可以看到爲什麼產生的字符串數組不包含任何內容?根據我的理解,gcnew String的構造函數應該創建非託管字符數組的副本,因此刪除不應該影響它(並且刪除刪除沒有任何區別)。我很難過。

+0

我有類似的問題在很久以前。 AFAIR您需要在跨越託管/非託管邊界時編組數據。請參閱http://msdn.microsoft.com/en-us/library/bb384865.aspx和http://msdn.microsoft.com/en-us/library/bb384859.aspx。 – Bazurbat 2012-04-06 08:50:04

+1

使用調試器。 – Abyx 2012-04-06 10:22:58

+0

Bazurbat,感謝您的建議,我試過了,但它沒有改變任何東西。 – penguinvasion 2012-04-06 11:12:47

回答

0

嘗試在循環而不是做這樣的:

fontNames[i] = marshal_as<String^>(unmanagedFontNames[i]); 

你需要一些指令,太:

#include <msclr/marshal.h> 
using namespace msclr::interop;