我有一个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的变量中。
答案 0 :(得分:1)
使用CLI的C ++,使用System :: String ^(这是一个.Net字符串,即与C#相同)
using GetOutputString = System::String^ (__stdcall *) ();
那你就可以做到
std::string standardString = context.marshal_as<std::string>(managedString);
答案 1 :(得分:0)
根据the documentation,C#将string
对象编组为简单的“指向以NULL终止的ANSI字符数组的指针”,或者用C ++术语表示为const char *
。
如果将GetOutputString
的typedef更改为返回const char *
,则一切正常。