C++ 導出「註冊回調」函數,C# 傳遞委托作為函數指針,C++ 觸發事件時調用委托,C# 收到通知後 `EventWaitHandle.Set()` 喚醒等待線程。
// Callback 類型
typedef void (__stdcall *DataReadyCallback)(void* userData);
// 註冊
extern "C" __declspec(dllexport) void RegisterCallback(DataReadyCallback cb, void* userData) {
g_callback = cb;
g_userData = userData;
}
// 內部觸發
void OnDataReady() {
if (g_callback) g_callback(g_userData);
}
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
delegate void DataReadyCallback(IntPtr userData);
[DllImport("CppDll.dll", CallingConvention = CallingConvention.StdCall)]
static extern void RegisterCallback(DataReadyCallback cb, IntPtr userData);
static EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset);
static void Main() {
DataReadyCallback cb = (userData) => wh.Set();
GCHandle handle = GCHandle.Alloc(cb); // 防止委托被 GC
RegisterCallback(cb, GCHandle.ToIntPtr(handle));
// 等待信號
wh.WaitOne();
Console.WriteLine("C++ 事件觸發!");
handle.Free();
}