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

时间:2020-03-05 18:51:27  来源:igfitidea点击:

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

解决方案

回答

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

回答

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

回答

System :: String有一个采用char *的构造函数:

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

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

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