C ++ .NET转换系统::字符串的std :: string(C++ .NET convert

2019-06-18 14:40发布

你如何转换系统::字符串的std :: string在C ++ .NET?

Answer 1:

有更清晰的语法,如果你使用的是最新的.NET版本

#include "stdafx.h"
#include <string>

#include <msclr\marshal_cppstd.h>

using namespace System;

int main(array<System::String ^> ^args)
{
    System::String^ managedString = "test";

    msclr::interop::marshal_context context;
    std::string standardString = context.marshal_as<std::string>(managedString);

    return 0;
}

这也为您提供了异常的脸更好地清理。

有一个MSDN文章为各种其他转换



Answer 2:

并以响应的C ++ / CLI更高版本的“简单的方式”,你可以做到这一点没有marshal_context。 我知道这工作在Visual Studio 2010中; 不知道在这之前。


#include "stdafx.h"
#include <string>

#include <msclr\marshal_cppstd.h>

using namespace msclr::interop;

int main(array<System::String ^> ^args)
{
    System::String^ managedString = "test";

    std::string standardString = marshal_as<std::string>(managedString);

    return 0;
}



Answer 3:

stdString = toss(systemString);

  static std::string toss( System::String ^ s )
  {
    // convert .NET System::String to std::string
    const char* cstr = (const char*) (Marshal::StringToHGlobalAnsi(s)).ToPointer();
    std::string sstr = cstr;
    Marshal::FreeHGlobal(System::IntPtr((void*)cstr));
    return sstr;
  }


Answer 4:

C#使用其字符串的UTF-16格式。
因此,除了刚刚转换的类型,你也应该有意识的对字符串的实际格式。

当编译多字节字符集 Visual Studio和运API假定UTF8(其实Windows编码是Windows的28591 )。
当编译为Unicode字符集 Visual Studio和运API承担UTF16。

所以,你必须将字符串从UTF-16到UTF8转换格式为好,而不是只转换为的std :: string。
多字符格式像一些非拉丁语言时,这将成为必要。

我们的想法是决定std::wstring 代表UTF-16。
std::string 始终代表UTF8。

这不是由编译器执行,它更是一个很好的政策有。

#include "stdafx.h"
#include <string>

#include <msclr\marshal_cppstd.h>

using namespace System;

int main(array<System::String ^> ^args)
{
    System::String^ managedString = "test";

    msclr::interop::marshal_context context;

    //Actual format is UTF16, so represent as wstring
    std::wstring utf16NativeString = context.marshal_as<std::wstring>(managedString); 

    //C++11 format converter
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;

    //convert to UTF8 and std::string
    std::string utf8NativeString = convert.to_bytes(utf16NativeString);

    return 0;
}

还是有它在更紧凑的语法:

int main(array<System::String ^> ^args)
{
    System::String^ managedString = "test";

    msclr::interop::marshal_context context;
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;

    std::string utf8NativeString = convert.to_bytes(context.marshal_as<std::wstring>(managedString));

    return 0;
}


Answer 5:

我有太多暧昧的错误显示了上述答案(是的,我是一个C ++小白)

这为我工作从C#发送字符串C ++ CLI

C#

bool result;
result = mps.Import(mpsToolName);

C ++ CLI

功能:

bool ManagedMPS::Import(System::String^ mpsToolNameTest)
std::string mpsToolName;
mpsToolName = toStandardString(mpsToolNameTest);

函数从字符串转换^到std ::作品串

static std::string toStandardString(System::String^ string)
{
 using System::Runtime::InteropServices::Marshal;
 System::IntPtr pointer = Marshal::StringToHGlobalAnsi(string);
 char* charPointer = reinterpret_cast<char*>(pointer.ToPointer());
 std::string returnString(charPointer, string->Length);
 Marshal::FreeHGlobal(pointer);
 return returnString;
}

ON进一步的研究,看来这是更清洁,更安全。

我切换到使用这种方法来代替。

std::string Utils::ToUnmanagedString(String^ stringIncoming)
{
   std::string unmanagedString = marshal_as<std::string>(stringIncoming);
   return unmanagedString;
}


Answer 6:

创建Windows运行时组件,您可以使用:

String^ systemString = "Hello";
std::wstring ws1(systemString ->Data());
std::string standardString(ws1.begin(), ws1.end());


文章来源: C++ .NET convert System::String to std::string