2012-04-06 162 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;