C++ DLL 匯出函式:
MMC_INT16U pmc4bpci_open(int id, void (WINAPI *funcIntHandler)(void));
第二參數為 **無參無回傳值的 `__stdcall` (WINAPI) 函式指標**,對應 C# 需定義相同呼叫慣例的 **委託**。
using System;
using System.Runtime.InteropServices;
public delegate void IntHandlerDelegate(); // 無參無回傳
public static class NativeMethods {
[DllImport("YourDll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern ushort pmc4bpci_open(int id, IntHandlerDelegate funcIntHandler);
}
WINAPI (__stdcall),預設 CallingConvention.Winapi 亦可(自動對應平台預設)。private static IntHandlerDelegate _callback; // 防止被 GC
public static void RegisterCallback() {
_callback = MyInterruptHandler; // 保持引用
ushort ret = NativeMethods.pmc4bpci_open(0, _callback);
}
private static void MyInterruptHandler() {
Console.WriteLine("Interrupt occurred!");
}
參考:C# 委託作為回調函式傳遞給 C++ DLL 完整指南
掌握「委託對應函式指標 + StdCall + 防 GC」三要素,即可安全實現 C++ 回調進 C#。