У меня есть функция на C++, имеющая значение типа std::string, и я хочу преобразовать ее в String^.
void(String ^outValue)
{
std::string str("Hello World");
outValue = str;
}
У меня есть функция на C++, имеющая значение типа std::string, и я хочу преобразовать ее в String^.
void(String ^outValue)
{
std::string str("Hello World");
outValue = str;
}
Поиск в Google показывает marshal_as (не проверено):
// marshal_as_test.cpp
// compile with: /clr
#include <stdlib.h>
#include <string>
#include <msclr\marshal_cppstd.h>
using namespace System;
using namespace msclr::interop;
int main() {
std::string message = "Test String to Marshal";
String^ result;
result = marshal_as<String^>( message );
return 0;
}
См. также Обзор маршалинга.
Из MSDN:
#include <string>
#include <iostream>
using namespace System;
using namespace std;
int main() {
string str = "test";
String^ newSystemString = gcnew String(str.c_str());
}
http://msdn.microsoft.com/en-us/library/ms235219.aspx
Насколько я понял, по крайней мере, подход marshal_as (не уверен в gcnew String) приведет к тому, что символы, отличные от ASCII UTF-8, в std::string будут сломаны.
Основываясь на том, что я нашел на https://bytes.com/topic/c-sharp/answers/725734-utf-8-std-string-system-string Я создал это решение, которое, кажется, работает для меня, по крайней мере, с немецкими диакритическими знаками. :
System::String^ StdStringToUTF16(std::string s)
{
cli::array<System::Byte>^ a = gcnew cli::array<System::Byte>(s.length());
int i = s.length();
while (i-- > 0)
{
a[i] = s[i];
}
return System::Text::Encoding::UTF8->GetString(a);
}
String^
не имеет особого смысла в C++. - person juanchopanza   schedule 05.12.2012