преобразовать из std::string в String^

У меня есть функция на C++, имеющая значение типа std::string, и я хочу преобразовать ее в String^.

void(String ^outValue)
{
   std::string str("Hello World");
   outValue = str;
}

person Moti    schedule 05.12.2012    source источник
comment
Я думаю, вам нужен другой тег, потому что String^ не имеет особого смысла в C++.   -  person juanchopanza    schedule 05.12.2012
comment
Это управляемый синтаксис С++. А ваша функция даже недействительна, идентификатора нет.   -  person Aesthete    schedule 05.12.2012
comment
Проблема в том, что эта функция используется для преобразования значения из C++ в C#/я имею в виду, что эта функция вызывается программой C#   -  person Moti    schedule 05.12.2012
comment
@juanchopanza также существует в WinRT и, вероятно, должен вызывать .c_str(); на std::string   -  person johnathan    schedule 05.12.2012
comment
@JoachimPileborg хорошо, я уверен, что для этого есть тег!   -  person juanchopanza    schedule 05.12.2012
comment
@Moti Я бы добавил тег для вас, но я ничего не знаю о C #, .NET, RT или о чем-то еще. Так что лучше, если вы это сделаете.   -  person juanchopanza    schedule 05.12.2012
comment
@Aesthete это также синтаксис winRT   -  person johnathan    schedule 05.12.2012
comment
@Moti, когда вы вызываете эту функцию из своего кода С#, вы передаете строку по ссылке или по значению?   -  person johnathan    schedule 05.12.2012
comment
@johnathon - Да, я сейчас все об этом читаю. Я уже изменил теги для вопроса, но я позволю ОП или кому-то еще изменить его на winRT / CLI - так как я не на 100% то, что должно быть.   -  person Aesthete    schedule 05.12.2012


Ответы (3)


Поиск в 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;
}

См. также Обзор маршалинга.

person Mark Tolonen    schedule 05.12.2012

Из 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

person Teodor Ciuraru    schedule 02.01.2015

Насколько я понял, по крайней мере, подход 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);
}
person Florian Straub    schedule 19.01.2021