將共用商業邏輯、資料存取、工具類別封裝為獨立 DLL (Class Library),可跨專案重用、版本管理、單元測試。本文涵蓋命令列編譯、Visual Studio 專案建立、版本控制、NuGet 封裝、ASP.NET 專案參考與執行階段載入機制。
方法一:命令列編譯 (csc.exe) — 理解底層原理
# 1. 準備原始碼 MyMath.cs
namespace MyLib { public class MathUtil { public static int Add(int a, int b) => a + b; } }
# 2. 編譯為 DLL (需在 Developer Command Prompt)
csc /target:library /out:MyLib.dll MyMath.cs
# 3. 多檔案編譯
csc /target:library /out:MyLib.dll MyMath.cs StringUtil.cs DataHelper.cs
# 4. 參考其他組件編譯
csc /target:library /out:MyLib.dll /r:System.Data.dll /r:Newtonsoft.Json.dll MyMath.cs
方法二:Visual Studio 建立 Class Library 專案 (標準流程)
- 檔案 → 新增專案 → 類別庫 → 專案名
MyLib。
- 撰寫類別,建置 (Build) → `bin\Debug\MyLib.dll` 產出。
- ASP.NET 專案右鍵「加入參考」 → 專案 → 勾選
MyLib (專案參考) 或「瀏覽」選取 DLL (檔案參考)。
- 專案參考優點:自動處理建置順序、Debug 可直接進入庫原始碼、重構同步更新。
版本控制與強名稱簽署
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.2024.0115")]
[assembly: AssemblyInformationalVersion("1.0.0-beta.1")]
- AssemblyVersion:執行階段繫結用,修改會導致參考專案需重新編譯/重新導向。
- AssemblyFileVersion:檔案屬性顯示用,不影響繫結。
- 強名稱:防止 DLL 劫持、支援 GAC 部署、允許同名不同版本共存。
NuGet 封裝與私有來源發布
# 1. 建立 .nuspec 或使用 SDK 風格專案 (PackageReference)
# 2. 打包
dotnet pack MyLib.csproj -c Release -o ./nupkgs
# 3. 發布至私有 NuGet Server (Azure Artifacts, MyGet, 本地資料夾)
nuget push MyLib.1.0.0.nupkg -Source https://my-nuget-server/ -ApiKey xxx
# 4. ASP.NET 專案安裝
Install-Package MyLib -Source MyPrivateSource
ASP.NET 執行階段 DLL 載入機制
| 階段 | 行為 |
| 建置 | 參考 DLL 複製至 ASP.NET 專案 `bin/` (專案參考自動,檔案參考需設定 Copy Local=True) |
| 啟動 | ASP.NET 掃描 `bin/` 所有 DLL 載入 AppDomain |
| JIT 編譯 | 首次呼叫方法時即時編譯 IL 為機器碼 |
| 版本重導向 | Web.config `` 設定 `dependentAssembly` `bindingRedirect` 解決版本衝突 |
Web.config 組件繫結重導向範例
常見問題與解決
| 錯誤 | 原因 | 解決 |
| 找不到檔案 'MyLib.dll' | Copy Local=False、輸出路徑錯誤、建置順序 | 專案參考自動處理;檔案參考設定 Copy Local=True |
| 無法載入檔案或組件 'xxx, Version=1.0.0.0' | 版本不符、缺少重導向、GAC 衝突 | 加入 bindingRedirect、確認 bin/ 實際 DLL 版本 |
| 方法簽章不符 | DLL 與參考專案版本不同步 | 重新建置參考專案、清除 bin/obj、避免直接替換 DLL |
| 偵錯無法進入 DLL 原始碼 | 無 PDB、優化編譯、非專案參考 | 使用專案參考、確認 PDB 複製至 bin/、Debug 模式建置 |
最佳實踐總結
- 共用程式碼**務必建立獨立 Class Library 專案**,勿直接複製 .cs 檔。
- 使用**專案參考**而非檔案參考,享受建置自動化與偵錯支援。
- 啟用**強名稱簽署**,正式版本發布前遞增 AssemblyVersion。
- 內部套件透過**私有 NuGet 來源**管理版本相依,避免 DLL 地獄。
- Web.config 設定 **bindingRedirect** 解決傳遞相依版本衝突。