我如何 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。
我正在尝试弄清楚如何将字符串值从 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。