使用非托管导出将字符串从 C# 返回到C++将返回数字

Returning string from C# to C++ using Unmanaged Exports returns numbers

本文关键字:返回 C++ 数字 字符串      更新时间:2023-10-16

我在 C# 中有一个函数,我使用非托管导出从C++调用该函数。传递的字符串在 C# 中正确接收,但返回的字符串C++显示为数字,如 5073480。这里可能有什么问题?我需要将字符串恢复到C++。以下是代码

C++代码:

using Testing = wchar_t*(__stdcall *) (wchar_t* name);
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE mod = LoadLibraryA("CSharp.dll");
Testing performTest = reinterpret_cast<Testing>(GetProcAddress(mod, "testing"));
wchar_t* d_str = L"JS";
wchar_t* result = performTest(d_str);
std::printf("Result from c#: %dn", result);
getchar();
return 0;
}

C# 代码:

[DllExport(ExportName = "testing", CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static string PassStringInOut([MarshalAs(UnmanagedType.LPWStr)]string name)
{
Console.WriteLine("Received string is: "+name);
return string.Format("Hello from .NET assembly, {0}!", name);
}

这里有几个问题。

格式字符串错误。要使用 printf 的 ASCII 版本打印 Unicode 字符串,指定的格式为%S(请注意大写字母S(。

其次,您在此处引入了内存泄漏。在C++中使用完字符串后,必须通过调用 CoTaskMemFree(假设您正在为 Windows 编写代码(来释放内存。