C ++ / CLI字符串转换

时间:2011-05-30 18:06:48

标签: string visual-c++ c++-cli interop stdstring

我发现这个非常好的代码片段将字符串转换为System:String^,如下所示:

System::String^ rtn = gcnew String(move.c_str());  // 'move' here is the string

我将rtn传递给C#程序。无论如何,在这个代码存在的函数内部,我传入System::String^。我还找到了一些使用以下代码将System:String^转换为字符串的代码:

pin_ptr<const wchar_t> wch = PtrToStringChars(cmd);  // 'cmd' here is the System:String          
size_t convertedChars = 0;
size_t  sizeInBytes = ((cmd->Length + 1) * 2);
errno_t err = 0;
char *ch = (char *)malloc(sizeInBytes);

err = wcstombs_s(&convertedChars,ch, sizeInBytes,wch, sizeInBytes);

现在我可以将'ch'用作字符串。

然而,这似乎比使用gcnew转换其他方式更多的工作。所以,最后我的问题是,是否有一些东西可以使用与gcnew方式类似的方式将System::String^转换为字符串?

2 个答案:

答案 0 :(得分:10)

使用VC ++的封送库:Overview of Marshaling in C++

#include <msclr/marshal_cppstd.h>

// given System::String^ mstr
std::string nstr = msclr::interop::marshal_as<std::string>(mstr);

答案 1 :(得分:0)

这可能很有用:

wchar_t *str = "Hi StackOverflow"; //native
String^ mstr= Marshal::PtrToStringAnsi((IntPtr)str); // native to safe managed
wchar_t* A=( wchar_t* )Marshal::StringToHGlobalAnsi(mstr).ToPointer(); // return back to native 

不要忘记using namespace System::Runtime::InteropServices;