重新導向元件版本

您可以將編譯時間繫結參考重新導向至 .NET Framework 組件、協力廠商組件或您自己的應用程式組件。 您可以用多種方式將應用程式重新導向為使用其他版本的組件:透過發行者原則、透過應用程式設定檔或透過電腦設定檔。 本文討論群組件系結在 .NET Framework 中的運作方式,以及如何進行設定。

提示

本文僅適用于 .NET Framework 應用程式。 如需 .NET 5 + (和 .NET Core) 中元件載入的詳細資訊,請參閱 .net 中的相依性載入。

組件統一和預設繫結

.NET Framework 組件的繫結有時會透過名為 「組件統一」(assembly unification) 的處理序進行重新導向。 .NET Framework 包含某個版本的通用語言執行平台,以及大約二十多個組成類型程式庫的 .NET Framework 組件。 執行階段將這些 .NET Framework 組件視為單一單位。 根據預設,應用程式啟動時,任何類型參考只要位於執行階段所執行的程式碼中,都會導向至 .NET Framework 組件;且該組建將與載入處理序的執行階段具有相同的版本號碼。 與此模型同時發生的重新導向,皆為執行階段的預設行為。

例如,如果您的應用程式參考 System.XML 命名空間中的型別,而且是使用 .NET Framework 4.5 所建立,它就會包含執行階段版本4.5 隨附之 System.XML 元件的靜態參考。 如果您想要將系結參考重新導向至 .NET Framework 4 隨附的 System.XML 元件,您可以在應用程式佈建檔中放入重新導向資訊。 統一的 .NET Framework 組件之設定檔中的繫結重新導向會取消統一該組件。

此外,如果有多個可用版本,您可能會想要以手動方式將協力廠商組件的組件繫結重新導向。

使用發行者原則重新導向版本

組件的廠商可以加入具有新組件的發行者原則檔,藉此將應用程式導向至較新版的組件。 發行者原則檔位於全域組件快取,其中包含組件重新導向設定。

組件的每個主要 .次要 版本都有自己的發行者原則檔。 例如,從 2.0.2.222 版重新導向至 2.0.3.000 版,以及從 2.0.2.321 版重新導向至 2.0.3.000 版,兩者的目標檔案皆相同,因為已透過 2.0 版建立了關係。 然而,從 3.0.0.999 版重新導向至 4.0.0.000 版則會傳入 3.0.999 版的檔案。 .NET Framework 的每個主要版本都有自己的發行者原則檔。

如果組件有發行者原則檔,則執行階段會在檢查組件的資訊清單和應用程式設定檔後,檢查此檔案。 廠商必須只在新組件與重新導向的舊版組件相容時,才使用發行者原則檔。

您可以指定應用程式設定檔中的設定,藉此略過應用程式的發行者原則,方法詳述於 略過發行者原則章節

在應用層級重新導向版本

有幾個不同的技巧可透過應用程式佈建檔變更您應用程式的系結行為:您可以 手動編輯檔案、 依賴自動系結重新導向,或者可以 略過發行者原則來指定系結行為。

手動編輯應用程式佈建檔

您可以手動編輯應用程式設定檔以解決組件問題。 例如,如果廠商可能發行您應用程式所使用的組件較新版本,但因為不保證與舊版相容而未提供發行者原則,則可以將組件繫結資訊放在應用程式的設定檔中 (如下所示),藉此將應用程式重新導向為使用較新版的組件。

<dependentAssembly>
  <assemblyIdentity name="someAssembly"
    publicKeyToken="32ab4ba45e0a69a1"
    culture="en-us" />
  <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>

依賴自動系結重新導向

當您在以 .NET Framework 4.5.1 或更新版本為目標的 Visual Studio 中建立桌面應用程式時,應用程式會使用自動系結重新導向。 這表示如果兩個元件參考了同一個強式名稱組件的不同版本,則執行階段會自動將繫結重新導向加入較新版組件的輸出應用程式設定檔 (app.config)。 此重新導向會覆寫可能執行的組件統一。 來源 app.config 檔案則不會加以修改。 例如,假設您的應用程式直接參考頻外 .NET Framework 元件,但使用以相同元件較舊版本為目標的協力廠商程式庫。 當您編譯應用程式時,輸出應用程式設定檔已修改為包含較新版元件的繫結重新導向。 如果您建立的是 Web 應用程式,則會收到有關繫結衝突的建置警告,從而提供您選項將必要的繫結重新導向加入來源 Web 設定檔中。

如果您在編譯時期手動將系結重新導向加入至來源 app.config 檔案,Visual Studio 會嘗試根據您新增的系結重新導向來統一元件。 例如,假設您為組件插入下列繫結重新導向:

<bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0" />

如果應用程式中另一個專案參考同一個組件的 1.0.0.0 版,自動繫結重新導向會將下列項目加入輸出 app.config 檔案,使得應用程式在此組件的 2.0.0.0 版上統一:

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />

如果您的應用程式以較舊版本的 .NET Framework 為目標,您可以啟用自動系結重新導向。 您可以覆寫這個預設行為,方法是在任何元件的 app.config 檔案中提供系結重新導向資訊,或是關閉系結重新導向功能。 如需有關如何開啟或關閉此功能的詳細資訊,請參閱 如何:啟用和停用自動系結重新導向。

略過發行者原則

您可以在必要時覆寫應用程式設定檔中的發行者原則。 例如,宣告與舊版相容的新版組件仍可能中斷應用程式。 如果您想要略過發行者原則,請將>publisherpolicy > 專案新增 至應用程式佈建檔中的>元素,並<] 屬性設定為 [>],這會覆寫任何先前的[是]設定。

<publisherPolicy apply="no" />

略過發行者原則可讓應用程式持續為使用者執行,但請務必將您的問題回報給組件的廠商。 如果組件有發行者原則檔,廠商應確保該組件與舊版相容,並確保用戶端使用新版時受到最少的限制。

在機器層級重新導向版本

電腦系統管理員要讓電腦上所有應用程式都使用特定版本組件的案例很少見。 例如,特定版本可能會修正安全性漏洞。 如果在電腦的設定檔中將元件重新導向(稱為 machine.config),則會將該電腦上使用舊版本的所有應用程式導向使用新的版本。 電腦設定檔會覆寫應用程式設定檔和發行者原則檔。 此 machine.config 檔案位於32位電腦的 %windir%\Microsoft.NET\Framework [version] \config\machine.config ,或64位電腦的 %windir%\Microsoft.NET\Framework64 [version] \config\machine.config

在設定檔中指定元件系結

您可以使用相同的 XML 格式來指定系結重新導向,不論它是在應用程式佈建檔、電腦設定檔或發行者原則檔中。 若要將某個元件版本重新導向至另一個版本,請使用 bindingRedirect >元素。 oldVersion 屬性可指定單一或一個範圍的組件版本。 newVersion 屬性應指定單一版本。 例如, <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指定單一繫結重新導向。 範例同時指定發行者原則檔不會覆寫 myThirdAssembly的繫結重新導向。

若要系結元件,您必須使用assemblyBinding 標籤中 xmlns屬性來指定字串 "urn:架構-microsoft-com: .asm. v1"。

<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 app,
          publisher policy, or machine configuration files. -->
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="mySecondAssembly"
          publicKeyToken="32ab4ba45e0a69a1"
          culture="en-us" />
             <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
      <assemblyIdentity name="myThirdAssembly"
        publicKeyToken="32ab4ba45e0a69a1"
        culture="en-us" />
        <!-- Publisher policy can be set only in the app
          configuration file. -->
        <publisherPolicy apply="no" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

將元件系結限制為特定版本

您可以使用應用程式設定檔中AssemblyBinding 元素的 appliesTo 屬性 ,將元件系結參考重新導向至特定版本的 .NET Framework。 這個選擇性屬性會使用 .NET Framework 版本號碼,以表示它適用於哪一個版本。 如果未指定appliesTo屬性,則 assemblyBinding 元素會套用至所有版本的 .NET Framework。

例如,若要將 .NET Framework 3.5 組件的組件繫結重新導向,您會將下列 XML 程式碼加入您的應用程式設定檔中。

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
    appliesTo="v3.5">
    <dependentAssembly>
      <!-- assembly information goes here -->
    </dependentAssembly>
  </assemblyBinding>
</runtime>

您必須依版本順序輸入重新導向資訊。 例如,請先輸入 .NET Framework 3.5 組件的組件繫結重新導向資訊,接著再輸入 .NET Framework 4.5 組件的資訊。 最後,針對未使用appliesTo屬性的任何 .NET Framework 元件重新導向,輸入元件系結重新導向資訊,因此適用于所有版本的 .NET Framework。 如果重新導向發生衝突,會使用設定檔中第一筆相符的重新導向陳述式。

例如,若要將一個參考重新導向至 .NET Framework 3.5 組件,並將另一個參考重新導向至 .NET Framework 4 組件,則您可以使用下列虛擬程式碼所示的模式。

<assemblyBinding xmlns="..." appliesTo="v3.5 ">
  <!--.NET Framework version 3.5 redirects here -->
</assemblyBinding>

<assemblyBinding xmlns="..." appliesTo="v4.0.30319">
  <!--.NET Framework version 4.0 redirects here -->
</assemblyBinding>

<assemblyBinding xmlns="...">
  <!-- redirects meant for all versions of the runtime -->
</assemblyBinding>

另請參閱