如何将 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_as
将System::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 <marshal_cppstd.h>
声明marshal_as
。
当我尝试 #include 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 System::String^ 转换为 std::string?
如何将扩展 ascii 转换为 System.String?
如何将 const wchar_t* 转换为 System::String?