大家好,今天是第七天,要來講的是 Platform Invoke (也常縮寫為 P/Invoke,中文或可稱為平台叫用)。
P/Invoke 允許從 Managed Code 存取 Unmanaged Code。例如從 .Net 的程式碼 (Managed) 內,存取 C++ (Unmanaged) 建立的函式庫 (Library),使用裡面的函式、結構或 Callback。
P/Invoke API 絕大部分包含在 System
和 System.Runtime.InteropServices
命名空間。
讓我們看回之前 DLLImport 的程式碼 (Day 19: C# 引用第三方程式: DLLImport - iT 邦幫忙),並為它加上一些註解:
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();
}
因為 P/Invoke 實作上會用到 DLLImport,因此在搜尋時,很容易看到 P/Invoke, DLLImport, Managed (Code), Unmanaged (Code) 等關鍵字一起出現。
關於 Managed Code 和 Unmanaged Code 的說明如下:
另外有兩點可以注意:
參考資料: Platform Invoke (P/Invoke) - Microsoft Learn