重新導向組件版本
更新:2007 年 11 月
當您根據強式名稱組件 (Assembly) 的特定版本來建置 .NET Framework 應用程式時,應用程式會在執行階段使用組件的那個版本。然而,您有時可能想要應用程式根據組件的最新版本來執行。應用程式組態檔、電腦組態檔或發行者原則檔都可以將組件的一個版本重新導向至另一個。如需 Common Language Runtime 如何使用這些檔案來決定要使用哪一個組件版本的詳細資訊,請參閱 Runtime 如何找出組件。您可以使用 .NET Framework 組態工具 (Mscorcfg.msc),在應用程式層級和電腦層級兩者上重新導向組件版本,或者您可以直接編輯組態檔。
注意事項: |
---|
您不能重新導向不是強式名稱的組件版本。Common Language Runtime 會忽略不是強式名稱的組件版本。 |
使用發行者原則重新導向組件版本
組件製造商可以藉著將發行者原則檔和升級的組件包含在一起,來聲明應用程式應該使用組件的較新版本。發行者原則檔 (位於全域組件快取) 包含組件重新導向設定值。
組件的每一個 major.minor 版本都有它自己的發行者原則檔。例如,從版本 1.1.2.222 至 1.1.3.000 和從版本 1.1.2.321 至版本 1.1.3.000 的兩個重新導向都會進入相同檔案。然而,從版本 2.0.0.999 至版本 3.0.0.000 的重新導向則會進入不同檔案。
如果發行者原則檔存在,Runtime 會在檢查組件資訊清單 (Assembly Manifest) 和應用程式組態檔之後檢查這個檔案。製造商應該只有在新組件與將要重新導向的組件為回溯相容時,才使用發行者原則。
您可以指定應用程式組態檔中的設定值來略過發行者原則。
略過發行者原則
聲稱為回溯相容的組件新版本仍然可能中斷應用程式。當這情形發生時,您可以使用應用程式組態檔的下列設定值,令執行階段略過發行者原則:
<publisherPolicy apply="no" />
略過發行者原則來保持您的應用程式繼續為您的使用者執行,但請務必將問題回報給組件製造商。一旦組件具有發行者原則,製造商應該確定組件為回溯相容以及用戶端可以盡可能使用新版本。
在應用程式層級重新導向組件版本
假定組件的製造商發行您應用程式所用組件的較新版本,但因製造商不想要保證新組件與原始版本回溯相容,所以沒有提供發行者原則。您可以將組件繫結資訊放在您應用程式的組態檔中,指出您的應用程式應該使用組件的較新版本。
在電腦層級重新導向組件版本
在電腦系統管理員想要電腦上的所有應用程式都使用組件的特定版本時,可能會有一種罕見的情況。例如,您可因為某特定組件版本會修復安全漏洞,而想要一切應用程式都使用該特定組件版本。如果組件在電腦的組態檔中重新導向,所有使用舊版本的應用程式都將使用新版本。電腦組態檔會覆寫應用程式組態檔和發行者原則。
在組態檔中指定組件繫結
應用程式組態檔、電腦組態檔和發行者原則檔都使用相同的 XML 結構描述來處理組件重新導向。
組件繫結
將各個組件的資訊放置在 <dependentAssembly> 項目內來指定組件的資訊。<assemblyIdentity> 項目包含辨識組件的資訊。您在組態檔中可以有多個 <dependentAssembly> 項目,但在每一個 <dependentAssembly> 項目中必須有正好一個 <assemblyIdentity> 項目。
若要繫結組件,您必須使用 <assemblyBinding> 標記 (Tag) 中的 xmlns 屬性來指定字串 "urn:schemas-microsoft-com:asm.v1"。
指定發行者原則
若要令執行階段略過特定組件的發行者原則,請將 <publisherPolicy> 項目放置在 <dependentAssembly> 項目中。若要令執行階段略過應用程式使用的所有組件的發行者原則,請將這個設定值放置在 <assemblyBinding> 項目中。您也可以使用 .NET Framework 組態工具 (Mscorcfg.msc) 來略過發行者原則。
apply 屬性的預設設定為 yes。將 apply 屬性設為 no 會覆寫任何先前的 yes 設定。例如,如果 apply 在應用程式層級設定為 no,任何組件特定 apply 設定值將會被忽略,即使它宣告這值為 yes 也一樣。如此,當該設定值變更此預設值時,no 設定值是唯一有用的狀態。
重新導向組件版本
若要重新導向一個版本至另一個,請使用 <bindingRedirect> 項目。oldVersion 屬性可以指定單一版本,或者版本的範圍。例如,<bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> 指定執行階段應該使用版本 2.0.0.0 來代替介於 1.1.0.0 和 1.2.0.0 間的組件版本。
範例
下列範例示範如何重新導向 myAssembly 的一個版本至另一個,並關閉 mySecondAssembly 的發行者原則。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Assembly versions can be redirected in application,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="mySecondAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Publisher policy can be set only in the application
configuration file. -->
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
重新導向 .NET Framework 組件繫結
您可以在應用程式組態檔的 <assemblyBinding> 項目上使用 appliesTo 屬性 (Attribute),將組件繫結參考重新導向至特定的 .NET Framework 版本。這個選擇性屬性使用 .NET Framework 版本號碼,指出它套用的版本。如果沒有指定 appliesTo 屬性,則 <assemblyBinding> 項目會套用至所有的 .NET Framework 版本。
appliesTo 屬性過去在 .NET Framework 1.1 版中介紹過,現在的 .NET Framework 1.0 版則將它省略。這表示在使用 .NET Framework 1.0 版時,所有的 <assemblyBinding> 項目都會被套用,甚至在指定了 appliesTo 屬性時也是如此。
例如,若要重新導向 .NET Framework 1.0 版組件 Regcode 的組件繫結,就必須在應用程式組態檔中包含下列 XML 程式碼。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
appliesTo="v1.0.3705">
<dependentAssembly>
<!-- assembly information goes here -->
</dependentAssembly>
</assemblyBinding>
</runtime>
輸入 <assemblyBinding> 項目時需注意先後順序。您應該先輸入任何 .NET Framework 1.0 版組件的組件繫結重新導向資訊,接著輸入任何 .NET Framework 1.1 版組件的組件繫結重新導向資訊。最後,再輸入由於未使用 appliesTo 屬性而適用於 .NET Framework 所有版本的任何 .NET Framework 組件的組件繫結重新導向資訊。在重新導向衝突的情況中會使用組態檔中第一個相符的重新導向陳述式。
例如,若要將某個參考重新導向到 .NET Framework 1.0 版組件,並將另一個參考重新導向到 .NET Framework 1.1 版組件,您可以使用下列虛擬程式碼中顯示的模式。
<assemblyBinding xmlns="..." appliesTo="v1.0.3705">
<!—.NET Framework version 1.0 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="..." appliesTo="v1.1.5000">
<!—.NET Framework version 1.1 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="...">
<!-- redirects meant for all versions of the runtime -->
</assemblyBinding>