C#'字符串'到C ++'std :: string'

时间:2019-07-09 07:45:06

标签: c# c++ marshalling

我有一个C#DLL,具有以下功能:

[DllExport(ExportName = "getOutputString", CallingConvention = CallingConvention.StdCall)]
public static String getOutputString()
{
    String managedString = "123456789012345678901234567890";
    return managedString;
}

和一个使用上述功能的C ++应用程序:

HMODULE mod = LoadLibraryA("MyCustomDLL.dll");
using GetOutputString = std::string (__stdcall *) ();
GetOutputString getOutputString = reinterpret_cast<GetOutputString>(GetProcAddress(mod, "getOutputString"));

,并希望将DLL中的字符串存储在C ++变量中为:

std::string myVariable = getOutputString();

当我运行C ++应用程序时,它崩溃了。

但是当我只在std :: printf代码中使用该功能时,效果就很好:

std::printf("String from DLL: %s\n", getOutputString());

我的实际任务是从DLL中获取字符串数组,但是如果您可以帮助我从C#中获取简单的String到C ++中的std :: string,那就太好了。

或者给我一个提示,可以通过std :: printf()将打印的字符串保存在类型为std :: string的变量中。

2 个答案:

答案 0 :(得分:1)

使用CLI的C ++,使用System :: String ^(这是一个.Net字符串,即与C#相同)

using GetOutputString = System::String^ (__stdcall *) ();

那你就可以做到

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

(信用[{https://stackoverflow.com/a/1300903/1848953]

答案 1 :(得分:0)

根据the documentation,C#将string对象编组为简单的“指向以NULL终止的ANSI字符数组的指针”,或者用C ++术语表示为const char *

如果将GetOutputString的typedef更改为返回const char *,则一切正常。