对本机dll的封送回调

本文关键字:回调 本机 dll | 更新日期: 2023-09-27 18:08:52

我正在使用回调从非托管本机库到我的托管c#代码。回调函数在头文件中声明:

typedef void* (TNotice)(wchar_t *msg, bool error);

回调有字符串参数msg。我不知道,为什么在c#中不工作声明:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate IntPtr CallbackDelegate([MarshalAs(UnmanagedType.LPWStr)]string msg, bool error);

但宣言:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate IntPtr CallbackDelegate([MarshalAs(UnmanagedType.LPWStr)]StringBuilder msg, bool error);

没问题。

对本机dll的封送回调

必须使用StringBuilder,因为参数是out参数或返回值。在这些情况下,你不能使用常规的string。您使用的封送是正确的。