C ++ / CLI Строковые Преобразования - PullRequest
2 голосов
/ 30 мая 2011

Я нашел этот действительно хороший кусок кода, который преобразует строку в 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. Итак, наконец, мой вопрос: есть ли что-то, что преобразует System::String^ в строку, аналогично способу gcnew?

Ответы [ 2 ]

10 голосов
/ 30 мая 2011

Использование библиотеки маршалинга VC ++: Обзор маршалинга в C ++

#include <msclr/marshal_cppstd.h>

// given System::String^ mstr
std::string nstr = msclr::interop::marshal_as<std::string>(mstr);
0 голосов
/ 03 июня 2011

это может быть полезно:

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;

...