Как превратить System:: String^ в std:: string?
поэтому я работаю в clr, создавая .NET dll в visual C++.
я тру такой код:
static bool InitFile(System::String^ fileName, System::String^ container)
{
return enc.InitFile(std::string(fileName), std::string(container));
}
имея энкодер, что нормально resives СТД::строка. но здесь компилятор (visual studio) дает мне ошибку C2664, если я удаляю аргументы из std::string и C2440, которые в целом одинаковы. VS говорит мне, что он просто не может преобразовать System::String^ в std::string.
поэтому мне грустно... что мне сделать, чтобы превратить System:: String^ в std:: string?
обновление:
теперь с вашей помощью у меня есть такой код
#include <msclrmarshal.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:: marshal_as': это преобразование не поддерживается библиотекой или файл заголовка, необходимый для этого преобразования, не включен. Пожалуйста, обратитесь к документации по "как: расширить библиотеку маршалинга" для добавления собственного маршалинга метод.
что делать?
4 ответов
если вы используете VS2008 или новее, вы можете сделать это очень просто с помощью тега автоматический маршалинг добавлен в C++. Например, вы можете конвертировать из System::String^
to std::string
via marshal_as
:
System::String^ clrString = "CLR string";
std::string stdString = marshal_as<std::string>(clrString);
это тот же маршалинг, используемый для вызовов P/Invoke.
из статьи как преобразовать 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"
вам нужно включить marshal_cppstd.h для преобразования строки^ в std:: string.
вы не упоминаете, беспокоитесь ли вы вообще о символах, отличных от ascii. Если вам нужен unicode (а если нет, то почему бы и нет!?), существует marshal_as, который возвращает std:: wstring.
Если вы используете utf8,вам придется свернуть свой собственный. Вы можете использовать простой цикл:
System::String^ s = ...;
std::string utf8;
for each( System::Char c in s )
// append encoding of c to "utf8";
как преобразовать из System:: String* в Char* в Visual C++
после char*
, просто передайте его std::string
конструктор.