非托管char *数组托管System ::字符串托管C++
问题描述:
我无法弄清楚我的代码在这里出了什么问题。这用于从我的非托管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的构造函数应该创建非托管字符数组的副本,因此删除不应该影响它(并且删除删除没有任何区别)。我很难过。
答
尝试在循环而不是做这样的:
fontNames[i] = marshal_as<String^>(unmanagedFontNames[i]);
你需要一些指令,太:
#include <msclr/marshal.h>
using namespace msclr::interop;
我有类似的问题在很久以前。 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
使用调试器。 – Abyx 2012-04-06 10:22:58
Bazurbat,感谢您的建议,我试过了,但它没有改变任何东西。 – penguinvasion 2012-04-06 11:12:47