Как превратить System :: String ^ в std :: string? - PullRequest
7 голосов
/ 22 августа 2010

Так что я работаю в clr, создавая .net dll в Visual C ++.

Я имею такой код:

 static bool InitFile(System::String^ fileName, System::String^ container)
{
    return enc.InitFile(std::string(fileName), std::string(container));
}

имея кодировщик, который обычно резервирует std :: string. но здесь компилятор (visual studio) выдает мне ошибку C2664, если я удаляю аргументы из std :: string и C2440, что в целом одинаково. VS говорит мне, что просто не может конвертировать System :: String ^ в std :: string.

Так что мне грустно ... что мне делать, чтобы превратить System :: String ^ в std :: string?

Обновление:

Теперь с вашей помощью у меня есть такой код

#include <msclr\marshal.h>
#include <stdlib.h>
#include <string.h>
using namespace msclr::interop;
namespace NSSTW
{
  public ref class CFEW
  {
 public:
     CFEW() {}

     static System::String^ echo(System::String^ stringToReturn)
    {
        return stringToReturn;  
    }

     static bool InitFile(System::String^ fileName, System::String^ container)
    {   
        std::string sys_fileName = marshal_as<std::string>(fileName);;
        std::string sys_container = marshal_as<std::string>(container);;
        return enc.InitFile(sys_fileName, sys_container);
    }
...

но когда я пытаюсь скомпилировать, это дает мне C4996

ошибка C4996: 'msclr :: interop :: error_reporting_helper <_To_Type, _From_Type> :: marshal_as': это преобразование не поддерживается библиотекой, или файл заголовка, необходимый для этого преобразования, не включен. Пожалуйста, обратитесь к документации «Как: расширить библиотеку маршалинга», чтобы добавить собственный метод маршалинга.

что делать?

Ответы [ 4 ]

7 голосов
/ 22 августа 2010

Если вы используете VS2008 или новее, вы можете сделать это очень просто с помощью автоматического маршалинга , добавленного в C ++ . Например, вы можете конвертировать из System::String^ в std::string через marshal_as:

System::String^ clrString = "CLR string";
std::string stdString = marshal_as<std::string>(clrString);

Это тот же самый маршалинг, который используется для вызовов P / Invoke.

4 голосов
/ 22 августа 2010

Из статьи Как преобразовать System :: String ^ в std :: string или std :: wstring на MSDN:

void MarshalString (String ^ s, string& os) 
{
    using namespace Runtime::InteropServices;
    const char* chars = 
      (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
    os = chars;
    Marshal::FreeHGlobal(IntPtr((void*)chars));
}

Использование:

std::string a;
System::String^ yourString = gcnew System::String("Foo");
MarshalString(yourString, a);
std::cout << a << std::endl; // Prints "Foo"
3 голосов
/ 21 февраля 2014

Вам нужно включить marshal_cppstd.h для преобразования String ^ в std :: string.

Вы не упоминаете, беспокоитесь ли вы вообще о персонажах, отличных от ascii. Если вам нужен юникод (а если нет, то почему бы и нет !?), есть маршал, который возвращает std :: wstring.

Если вы используете utf8, вам придется свернуть свой собственный. Вы можете использовать простой цикл:

System::String^ s = ...;
std::string utf8; 
for each( System::Char c in s )
    // append encoding of c to "utf8";
1 голос
/ 22 августа 2010

Как преобразовать из System :: String * в Char * в Visual C ++

Получив char*, просто передайте его конструктору std::string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...