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

Posted

技术标签:

【中文标题】如何将 System::String^ 转换为 std::string?【英文标题】:How to turn System::String^ into std::string? 【发布时间】:2010-08-21 22:42:51 【问题描述】:

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

我相信这样的代码:

 static bool InitFile(System::String^ fileName, System::String^ container)

    return enc.InitFile(std::string(fileName), std::string(container));

具有正常响应 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<_to_type>::marshal_as': 库不支持此转换或不包含此转换所需的头文件。请参阅有关“如何:扩展编组库”的文档以添加您自己的编组方法。

怎么办?

【问题讨论】:

您已加入 msclr\marshal.h。试试msclr\marshal_cppstd.h @Chris Schmich:谢谢 - 现在编译完美=) 【参考方案1】:

如果您使用的是 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 调用的编组相同。

【讨论】:

我喜欢这个想法,但是如何在我的代码中声明 marshal_as?我应该在哪里和写什么来声明它(摆脱错误 C2065),我使用 VS2008 要从System::String^std::string,您需要在#include &lt;marshal_cppstd.h&gt; 声明marshal_as 当我尝试 #include 它给了我致命错误 C1083... 所以我编辑了代码并将其发布在问题中(我使用他们在 MS MSDN 示例中使用的内容).. .请你看一下。 对不起,我有点跑题了,你需要包括msclr\marshal_cppstd.h。你还有这个问题吗?你上面的代码仍然是msclr\marshal.h msclr\marshal.h 也可以。谢谢顺便说一句。 :)【参考方案2】:

来自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"

【讨论】:

【参考方案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";

【讨论】:

【参考方案4】:

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

一旦你有了char*,只需将它传递给std::string 构造函数。

【讨论】:

以上是关于如何将 System::String^ 转换为 std::string?的主要内容,如果未能解决你的问题,请参考以下文章

将String ^转换为标准C ++字符串

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

如何将扩展 ascii 转换为 System.String?

如何将 const wchar_t* 转换为 System::String?

将 System::String^ 转换为 unsigned char*

C++ .NET 将 System::String 转换为 std::string