如何将System :: String ^转换为std :: string?

时间:2010-08-21 22:42:51

标签: .net c++ visual-studio string visual-c++

所以我在clr中工作,在visual c ++中创建.net dll。

我是这样的代码:

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

具有normaly resives std :: string的编码器。但是如果我从std :: string和C2440中删除通常相同的参数,那么编译器(visual studio)会给出C2664错误。 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&lt; _To_Type,_From_Type&gt; :: marshal_as':库不支持此转换,或者不包含此转换所需的头文件。请参阅“如何:扩展封送库”的文档,以添加自己的封送方法。

该怎么办?

4 个答案:

答案 0 :(得分:6)

如果您使用的是VS2008或更新版本,则只需使用automatic marshaling added to C++即可。例如,您可以通过marshal_asSystem::String^转换为std::string

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

这与用于P / Invoke调用的编组相同。

答案 1 :(得分:4)

来自MSDN上的文章How to convert System::String^ to std::string or std::wstring

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"

答案 2 :(得分:3)

您需要包含marshal_cppstd.h以将String ^转换为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";

答案 3 :(得分:1)

How to convert from System::String* to Char* in Visual C++

获得char*后,只需将其传递给std::string构造函数即可。