如何将System::String^转换为std::String? 我在CLR中工作,在Visual C++中创建.NET DLL。
我必须遵守这些守则:如何将System::String^转换为std::String? 我在CLR中工作,在Visual C++中创建.NET DLL。,.net,c++,visual-studio,string,visual-c++,.net,C++,Visual Studio,String,Visual C++,我必须遵守这些守则: static bool InitFile(System::String^ fileName, System::String^ container) { return enc.InitFile(std::string(fileName), std::string(container)); } 具有正常调整std::string大小的编码器。但是在这里,如果我从std::string和C2440中去掉参数,编译器(VisualStudio)会给我C2664错误,这通
static bool InitFile(System::String^ fileName, System::String^ container)
{
return enc.InitFile(std::string(fileName), std::string(container));
}
具有正常调整std::string大小的编码器。但是在这里,如果我从std::string和C2440中去掉参数,编译器(VisualStudio)会给我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);
}
...
#包括
#包括
#包括
使用名称空间msclr::interop;
名称空间NSSTW
{
公共参考类CFEW
{
公众:
CFEW(){}
静态系统::字符串^echo(系统::字符串^stringToReturn)
{
返回字符串返回;
}
静态bool InitFile(系统::字符串^fileName,系统::字符串^container)
{
std::string sys_fileName=marshal_as(fileName);;
std::string sys_container=marshal_as(container);;
返回enc.InitFile(sys\u文件名,sys\u容器);
}
...
但当我尝试编译时,它会给我C4996
错误C4996:“msclr::interop::error_reporting_helper::marshal_as”:库不支持此转换,或者未包含此转换所需的头文件。请参阅“如何:扩展封送处理库”文档以添加您自己的封送处理方法
怎么办?
一旦您有了
char*
,只需将其传递给std::string
构造函数。如果您使用的是VS2008或更高版本,则可以非常简单地使用。例如,您可以通过以下方式将System::string^
转换为std::string
:
System::String^clrString=“CLR String”;
std::string stdString=marshal_as(clrString);
这与p/Invoke调用使用的封送处理相同。摘自MSDN上的文章:
用法:
std::string a;
System::String^ yourString = gcnew System::String("Foo");
MarshalString(yourString, a);
std::cout << a << std::endl; // Prints "Foo"
std::字符串a;
系统::字符串^yourString=gcnew系统::字符串(“Foo”);
MarshalString(yourString,a);
std::cout您需要包含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";
我喜欢这个想法,但如何在我的代码中声明marshal_?我应该在哪里和写什么来声明它(以消除错误C2065),我使用VS2008从System::String^
转到std::String
,您需要#包含
在声明封送时的位置。当我尝试#包含时,它会给我致命错误C1083…所以我编辑了代码并将其发布到这里(我使用了MS MSDN示例中使用的代码)…你能看一下吗?对不起,我有点不对劲,你需要包括msclr\marshall\u cppstd.h
。你仍然有这个问题吗?你上面的代码仍然是msclr\marshall.h
。msclr\marshall.h也很好。顺便说一句:)你已经包括了msclr\marshall.h
。试试msclr\marshall\cppstd.h
。@Chris施密奇:谢谢-现在它编译得很好=)
std::string a;
System::String^ yourString = gcnew System::String("Foo");
MarshalString(yourString, a);
std::cout << a << std::endl; // Prints "Foo"
System::String^ s = ...;
std::string utf8;
for each( System::Char c in s )
// append encoding of c to "utf8";