本文節選自《.NET 程式設計師面試指南》,透過面試題深度解析組件版本策略原理與配置方法。
當組件透過名稱、版本、文化特性、公開金鑰載入時,CLR 允許指定哪些版本可替代當前版本載入。版本策略 = 組件版本重導向,將載入當前版本導向可替代版本。可在三個層級配置:
三層級皆透過 XML 組態檔配置,CLR 依序執行:應用程式 → 發行者 → 電腦,上一層輸出作為下一層輸入。
位於應用程式目錄下:
exe檔名.config(如 test.exe.config)web.config版本策略記錄於 <assemblyBinding> 節點:
<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding>
<dependentAssembly>
<assemblyIdentity
name="NET.MST.Second.Compile"
publicKeyToken="60c29e5f0af3e9bb" />
</dependentAssembly>
<bindingRedirect oldVersion="0.0.0.0-12.2.2.2" newVersion="12.3.0.0" />
</assemblyBinding>
</runtime>
</configuration>
將 0.0.0.0~12.2.2.2 所有版本重導向至 12.3.0.0。
針對置入 GAC 的組件。格式同應用程式策略,但檔名特殊:主版本.次版本.組件名.dll。一個組件每個主/次版本僅能有一個發行者策略。與組件一同放入 GAC。
檔名固定為 machine.config,位於 %SystemRoot%\Microsoft.NET\Framework\v****\CONFIG 目錄。格式同前兩者。
執行順序:應用程式 → 發行者 → 電腦。發行者策略為可選,以下兩種情況略過:
忽略發行者策略配置:
<publisherPolicy apply="no" />
完整範例(在前例基礎上添加):
<assemblyBinding>
<dependentAssembly> ... </dependentAssembly>
<bindingRedirect oldVersion="0.0.0.0-12.2.2.2" newVersion="12.3.0.0" />
<publisherPolicy apply="no" />
</assemblyBinding>
CLR 支援三層級版本策略,依序執行並傳遞結果。發行者策略僅針對 GAC 組件,可在應用程式層透過 publisherPolicy apply="no" 略過。掌握此機制可解決組件版本衝突、實現無縫升級與相容性控制。