非托管char *数组到托管C ++中的托管System :: String

时间:2012-04-06 08:19:25

标签: c++ c++-cli marshalling

我无法弄清楚我的代码出了什么问题。这用于从我的非托管C ++代码创建数组fontNames,然后在C#中检索。 C#代码只输出一个空字符串数组。 (对于使用相同方法的其他一组int,这不是问题。)

请注意,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的构造函数应该创建非托管char数组的副本,因此删除不应该影响它(删除删除没有区别)。我很难过。

1 个答案:

答案 0 :(得分:0)

尝试在循环中执行此操作:

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

您也需要一些指令:

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