什麼是 Platform Invoke (P/Invoke)

January 29, 2023

什麼是 Platform Invoke (P/Invoke,中文或可稱為平台叫用) ?

介紹

  • 允許從 Managed Code 存取 Unmanaged Code。例如從 .Net 的程式碼內,存取 C++ 建立的函式庫 (Library),使用裡面的函式、結構或 Callback。
  • P/Invoke API 絕大部分包含在 SystemSystem.Runtime.InteropServices 命名空間。
  • 最常見的例子:
static class AddSharp
{
    internal static class UnsafeNativeMethods
    {
        const string _dllLocation = "DllExample.dll";
        [DllImport(_dllLocation)] // 重要:告知執行期間要載入的 DLL
        public static extern int Add(int a, int b); // 關鍵:宣告相同的方法,extern 表示為外部方法 (在 DLL 內)
    }

    public static void Execute(){
        Console.WriteLine(UnsafeNativeMethods.Add(5, 10)); // 可以用 Managed 的方式 (如一般的 C# 方法) 呼叫使用
    }
}
public void Run(){
    AddSharp.Execute();
}
  • 在 MacOS 或 Linux 中,除了外部函式庫名稱不同以外,使用方式類似,可參閱下方參考資料。
  • P/Invoke 是雙向的,也可以由 Unmanaged Code 呼叫 Managed Code。以下方參考資料中的例子來說,會宣告包含委派的外部方法,並傳入 C# 的委派方法。
  • 參考資料: Platform Invoke (P/Invoke) - Microsoft Learn