C# 編譯產出的 DLL 與傳統 C++/VB DLL 本質不同:它是受控代碼(Managed Code),包含中間語言(IL),需經 CLR JIT 編譯為機器碼才能執行。本質上是類別庫(Class Library)。本文完整示範:建立 DLL 原始碼、CSC 編譯指令、客戶端專案呼叫全流程。
csc.exe(C# 編譯器)DLL 無需 Main 進入點,本質是封裝命名空間與類別。
namespace MyDll
{
public class Calculator
{
public string GetWelcomeMessage()
{
return "歡迎使用 Visual C# 建立的類別庫!";
}
public int Add(int a, int b) => a + b;
public int Multiply(int a, int b) => a * b;
}
}
csc /target:library /out:MyDll.dll /reference:System.dll dll.cs
| 參數 | 說明 | 範例 |
|---|---|---|
/target:library | 輸出類別庫(DLL) | /t:library |
/target:exe | 輸出主控台應用程式 | /t:exe |
/target:winexe | 輸出 Windows 應用程式 | /t:winexe |
/target:module | 輸出模組(無組件資訊) | /t:module |
/out:檔名 | 指定輸出檔名 | /out:MyDll.dll |
/reference:組件 | 參考其他組件 | /r:System.dll |
/debug | 產生偵錯符號 | /debug+ |
/optimize | 啟用優化 | /optimize+ |
| 特性 | 傳統 DLL (C++/VB6) | C# DLL (Managed) |
|---|---|---|
| 代碼類型 | 機器碼 | IL (中間語言) |
| 執行環境 | 直接由 OS 載入 | 需 CLR + JIT 編譯 |
| 匯出方式 | 函數匯出表 (__declspec(dllexport)) | 公共類別/方法 (public class/method) |
| 呼叫慣例 | stdcall/cdecl 等 | CLR 統一呼叫慣例 |
| 型別系統 | C/C++ 原生型別 | .NET 通用型別系統 (CTS) |
| 版本管理 | 困難 | 組件版本、強名稱、GAC |
| 跨語言互通 | 需定義 C 介面 | 原生支援所有 .NET 語言 |
sn -k key.snk → 專案屬性 → 簽署 → 可部署至 GACAssemblyVersion、AssemblyFileVersiondotnet pack 發布至 NuGet.orgC# 建立 DLL 本質是建立類別庫,核心流程:
public 類別與方法csc /t:library 編譯或 VS 專案建置/reference 參考 DLLusing 導入命名空間,直接實例化呼叫理解其為受控代碼、IL 本質、CLR 執行模型,能避免傳統 DLL 思維帶來的誤區。