关于.net:在C / CLI中在char *和System :: String之间转换的最佳方法是什么

关于.net:在C / CLI中在char *和System :: String之间转换的最佳方法是什么

What is the best way to convert between char* and System::String in C++/CLI

从char *转换为System :: string并返回C / CLI的批准方法是什么?我在Google上发现了一些对marshal_to <>模板函数的引用,但似乎该功能从未在Visual Studio 2005中有所作为(在Visual Studio 2008中也没有,AFAIK也没有)。我还在Stan Lippman的博客上看到了一些代码,但这是从2004年开始的。我还看到了Marshal :: StringToHGlobalAnsi()。是否有一种被认为是"最佳实践"的方法?


System :: String具有一个采用char *:

的构造函数

1
2
3
4
 using namespace system;
 const char* charstr ="Hello, world!";
 String^ clistr = gcnew String(charstr);
 Console::WriteLine(clistr);

找回char *有点困难,但还不算太糟:

1
2
3
4
 IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
 char *pNewCharStr = static_cast<char*>(p.ToPointer());
 cout << pNewCharStr << endl;
 Marshal::FreeHGlobal(p);

这里有一个很好的概述(为VS2008添加了此封送处理支持):
http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx


我创建了一些辅助方法。我需要执行此操作才能从旧的Qt库移至CLI字符串。如果任何人都可以添加此内容并告诉我是否似乎存在内存泄漏以及如何解决该问题,我将非常感激。

1
2
3
4
5
6
7
8
9
10
11
12
void MarshalString (  String ^ s, wstring& os ) {
    using namespace Runtime::InteropServices;
    const wchar_t* char = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
    os = char;
}
QString SystemStringToQt( System::String^ str)
{
    wstring t;
    MarshalString(str, t);
    QString r = QString::fromUcs2((const ushort*)t.c_str());
    return r;
}

我们所做的是创建一个C \\\\ CLI对象,该对象将字符串保留在未经整理的代码中,并将给出该项目的受管理副本。转换代码非常类似于Stan在他的博客中所写的(我不记得确切)(如果使用他的代码,请确保将其更新为使用delete []),但是我们确保析构函数将处理释放所有对象的未管理元素。这有点夸张,但是当我们绑定到旧的C代码模块时,我们没有泄漏。


一个可能的方法摘要的附加链接:

http://support.microsoft.com/?kbid=311259


推荐阅读