首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 函式指標回調對應 C# 委託:P/Invoke 簽章轉換

     編輯:程式設計綜合問答

C++ DLL 匯出函式:

MMC_INT16U pmc4bpci_open(int id, void (WINAPI *funcIntHandler)(void));

第二參數為 **無參無回傳值的 `__stdcall` (WINAPI) 函式指標**,對應 C# 需定義相同呼叫慣例的 **委託**。

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);
}

關鍵點

  • CallingConvention.StdCall:對應 C++ WINAPI (__stdcall),預設 CallingConvention.Winapi 亦可(自動對應平台預設)。
  • 委託簽章:必須與 C++ 函式指標完全一致(參數、回傳值、呼叫慣例)。
  • 委託實例保持存活:傳遞給非受控碼的委託**必須在 Managed 端保持引用**(如存為 static 欄位),否則 GC 回收後非受控呼叫會導致崩潰。

使用範例

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#。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved