Итак, я работаю в 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': это преобразование не поддерживается библиотекой, или файл заголовка, необходимый для этого преобразования, не включен. См. документацию на 'Как: расширить Библиотека маршалинга »для добавления вашего собственного метода маршалинга.
что делать?
Если вы используете VS2008 или новее, вы можете сделать это очень просто с помощью автоматического маршалинга , добавленного в C ++ . Например, вы можете преобразовать из System :: String ^
в std :: string
через marshal_as
:
System::String^ clrString = "CLR string";
std::string stdString = marshal_as<std::string>(clrString);
Это тот же маршалинг, который используется для P / Вызов звонков.
Из статьи Как преобразовать 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"
Как преобразовать из System :: String * в Char * в Visual C ++
Если у вас есть char *
, просто передайте его в std :: string
конструктор.