我的代码有效,但我害怕 P/Invoke 中的内存。
这是我将从本机 C++ 代码调用的委托。
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
public delegate string CommandCallbackDelegate([MarshalAs(UnmanagedType.LPWStr)] string command
, [MarshalAs(UnmanagedType.LPWStr)] string arg1
, [MarshalAs(UnmanagedType.LPWStr)] string arg2
);
在 C# 中,我将委托传递给本机 DLL。
private static GCHandle _gcHandle;
public static void RegisterCommandCallback(CommandCallbackDelegate fun) { _gcHandle = GCHandle.Alloc(fun);
if (IntPtr.Size == 8)
RegisterCommandCallback_x64(fun);
else
RegisterCommandCallback_x86(fun);
}
而在原生DLL中,我得到函数指针后,就可以成功调用方法,并得到String
C#的返回值。
typedef LPCWSTR (WINAPI* PFN_CommandCallback)( LPCWSTR wszCommand, LPCWSTR wszArg1, LPCWSTR wszArg2);
PFN_CommandCallback g_pfnCommandCallback = ....;
LPCWSTR wszRet = g_pfnCommandCallback( L"CMD", L"ARG1", L"ARG2");
如您所见,C#方法返回String
到本机DLL,我不确定返回的非托管内存是否被GC释放。
虽然我上面的代码有效,但恐怕它正在访问刚刚释放的内存。