常规来说,会调用C#中Runtime::InteropServices::Marshal下的函数去进行转换,如下,使用了其中的一个函数,
char * ch = (char*)(void*)Runtime::InteropServices::Marshal::StringToHGlobalAnsi(managedString);
std::string myString = std::string(ch);
但是这个API会造成内存泄露,网上搜索,StackOverflow上有人遇到相同问题,点击这里,给出的答案如下,
#include <msclr\marshal.h>
System::String^ ToManaged(const wchar_t* unmanagedString)
{
return msclr::interop::marshal_as<System::String^>(unmanagedString);
}
gcroot<msclr::interop::marshal_context^> context;
const wchar_t* ToUnmanaged(System::String^ managedString)
{
msclr::interop::marshal_context^ unpacked = context;
if (unpacked != nullptr)
delete unpacked;
context = gcnew msclr::interop::marshal_context();
return context->marshal_as<const wchar_t*>(managedString);
}
该答者提供了互相转换的函数,经过测试,确实没有内存泄露。
第二个函数ToUnmanaged()看起来有点迷惑,其原理是使用全局变量context,让它来执行转换,转换完之后内存并没有释放,等到第二次再调用这个函数时才去释放上一次的内存。
如果C++这边不是使用wchar_t*,而是使用char*,那么就改成如下,
gcroot<msclr::interop::marshal_context^> context;
const char* ToUnmanaged(System::String^ managedString)
{
msclr::interop::marshal_context^ unpacked = context;
if (unpacked != nullptr)
delete unpacked;
context = gcnew msclr::interop::marshal_context();
return context->marshal_as<const char*>(managedString);
}