我如何 return 从 C++/CLI 方法返回到调用它的非托管 C++ 的字符串

How can I return a string from a C++/CLI method back to unmanaged C++ that calls it

我正在尝试弄清楚如何将字符串值从 C++/CLI 方法 return 返回到调用它的非托管 C++。在我当前的实现中,我有一个字符串存储在(托管)C++/CLI 方法中的本地 String ^ 变量中,我 w/like 将方法 return 返回到调用它的非托管 C++ 程序。如果使用 String ^ 变量不是一个好的选择,什么 construct/type w/be 更好?请注意,我省略了 C# 方法 return 将字符串值返回给 C++/CLI 方法的部分,因为这不是问题。

我正在使用 VS2017。

代码示例 - 为简单起见,代码已经减少。

非托管 C++ --------------------------

_declspec(dllexport) void GetMyString();

int main()
{
    GetMyString();
}

(托管)C++/CLI ------------------------

__declspec(dllexport) String GetMyString()
{
    String ^ sValue = "Return this string";
    return (sValue);
}

非常感谢任何帮助。提前致谢。

你不能 return a String ^ 到 c++,因为它不会识别它。虽然有一些使用 InteropServices 的转换。来自 microsoft

using namespace System;

void MarshalString ( String ^ s, std::string& os ) {
   using namespace Runtime::InteropServices;
   const char* chars =
      (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(IntPtr((void*)chars));
}

我最终在托管 C++ 方法中将 System::String^ 转换为 std::string,然后将后者返回给非托管 C++ 调用方。


托管 C++ 文件摘录:

#include <msclr\marshal_cppstd.h>

__declspec(dllexport) std::string MyManagedCppFn()
{
    System::String^ managed = "test";
    std::string unmanaged2 = msclr::interop::marshal_as<std::string>(managed);
    return unmanaged2;
}

非托管 C++ 文件摘录:

_declspec(dllexport) std::string MyMangedCppFn();

std::string jjj = MyMangedCppFn();    // call Managed C++ fn

致谢 answer/edit from tragomaskhalos and Juozas Kontvainis 一个 Whosebug 问题,询问如何将 System::String^ 转换为 std::string。