傳統 DLL (C++/VB6) 編譯為機器碼,直接由作業系統載入執行。C# 編譯器產生的是中介語言 (IL) 程式碼,屬於受控代碼,需經由 CLR 的 JIT 編譯器在執行時轉換為機器碼。因此,C# 「DLL」本質上是組件,封裝型別定義(類別、介面、列舉等),相當於類別庫。
namespace MyLib
{
public class Greeting
{
public string GetMessage()
{
return "歡迎使用 C# 類別庫!";
}
}
}
※ 類別庫不需要 Main 方法。
csc /target:library /out:MyLib.dll MyLib.cs
或在 Visual Studio 中建立「類別庫」專案類型。
using MyLib; // 匯入命名空間
using System;
public class Program
{
public static void Main()
{
Greeting g = new Greeting();
Console.WriteLine(g.GetMessage());
}
}
csc /reference:MyLib.dll /r:System.dll Client.cs
執行 Client.exe 即可輸出問候訊息。執行時 MyLib.dll 必須位於同目錄或 GAC 中。
| 特性 | 傳統 Win32 DLL | C# 類別庫 (組件) |
|---|---|---|
| 程式碼形式 | 機器碼 | IL 中介語言 |
| 執行方式 | OS 直接載入 | CLR JIT 編譯執行 |
| 型別系統 | 無標準型別資訊 | 豐富中繼資料、反射支援 |
| 版本控制 | 易發生 DLL Hell | 強名稱、並行執行、GAC |
| 語言互通 | 需定義 C 風格介面 | CLS 合規,跨語言無縫呼叫 |
C# 透過組件機制徹底解決了傳統 DLL 的版本衝突與型別安全問題,是 .NET 元件化開發的基石。