詳細示範從零建立標準 C 風格 DLL,並由 C# 透過 P/Invoke (DllImport) 呼叫的完整流程。原理同呼叫 Win32 API。
csc.exe)MyLib.c:
__declspec(dllexport) int __cdecl add(int a, int b); // 匯出聲明
int add(int a, int b) { // 實作
return a + b;
}
命令列編譯:
cl /LD MyLib.c
輸出:MyLib.dll、MyLib.lib、MyLib.exp。
InvokeDll.cs:
using System;
using System.Runtime.InteropServices; // 必須引用
public class InvokeDll {
[DllImport("MyLib.dll", CharSet = CharSet.Auto)]
static extern int add(int a, int b); // 外部函式聲明
public static void Main() {
Console.WriteLine(add(10, 30)); // 輸出: 40
}
}
編譯與執行:
csc InvokeDll.cs
InvokeDll.exe # 需與 MyLib.dll 同目錄
| 項目 | 說明 |
|---|---|
| __declspec(dllexport) | 告知編譯器將函式匯出至 DLL 匯出表 |
| __cdecl | C 預設呼叫慣例(呼叫端清理堆疊),C# P/Invoke 預設即為此慣例 |
| DllImport | 標示外部非托管函式,由 CLR 處理封送 |
| CharSet.Auto | 依平台自動選擇 ANSI/Unicode 字串封送 |
| static extern | 指示方法為外部非托管實作 |
提示: 實務開發建議使用 Visual Studio 專案管理(C++ DLL 專案 + C# 專案),設定建置順序與輸出路徑,避免手動複製 DLL。本範例採命令列展示最核心流程。