我有一个需要从 C# 调用的第三方非托管 C++ dll。C++ 函数返回一个 char*。我已经想出了如何将其转换为 C# 中的托管字符串。但我不知道是否需要释放内存。以下代码有效,但 Marshal.FreeHGlobal(p) 抛出“句柄无效。”。那么我是否需要释放内存,如果需要,如何?
[DllImport("abc.dll", EntryPoint = "?GetVersion@ABC@@QEAAPEADXZ", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
private static extern unsafe char* GetVersionRaw();
public static unsafe string GetVersion()
{
char* x = Abc.GetVersionRaw(); // call the function in the unmanaged DLL
IntPtr p = new IntPtr(x);
string s = Marshal.PtrToStringAnsi(p);
Marshal.FreeHGlobal(p);
return s;
}