Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将System::String^转换为std::String? 我在CLR中工作,在Visual C++中创建.NET DLL。_.net_C++_Visual Studio_String_Visual C++ - Fatal编程技术网

如何将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";