共用方式為


.NET Framework 中的並存執行

備註

本文專屬於 .NET Framework。 它不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。

並行執行是在相同電腦上執行多個版本的應用程式或元件。 您可以在同一台電腦上擁有多個公共語言運行庫版本,以及使用這些運行庫版本的多個應用程式和元件版本。

下圖顯示在同一部計算機上使用兩個不同運行時間版本的數個應用程式。 應用程式 A、B 和 C 使用執行時間 1.0 版,而應用程式 D 則使用執行時間 1.1 版。

不同運行時間版本的並存執行,

.NET Framework 是由 Common Language Runtime 和包含 API 類型的元件集合所組成。 執行階段和 .NET Framework 元件會獨立版本。 例如,運行時間 4.0 版實際上是 4.0.319 版,而 .NET Framework 元件的 1.0 版則是 1.0.3300.0 版。

下圖顯示在同一部計算機上使用兩個不同元件版本的數個應用程式。 應用程式 A 和 B 使用元件 1.0 版,而應用程式 C 則使用相同元件的 2.0 版。

顯示元件並存執行的圖表。

並列執行可讓您更充分掌控應用程式所系結的元件版本,以及更能控制應用程式所使用的執行環境版本。

並行執行的優點

在 Windows XP 和 .NET Framework 之前,發生 DLL 衝突是因為應用程式無法區分相同程式碼不相容的版本。 DLL 中包含的類型資訊只系結至檔名。 應用程式無法得知 DLL 中包含的類型是否與應用程式所建置的類型相同。 因此,新版本的元件可能會覆寫舊版並中斷應用程式。

並存執行和 .NET Framework 提供下列功能來消除 DLL 衝突:

  • 強名稱元件。

    並存執行會使用強名稱元件,將類型資訊系結至元件的特定版本。 這可防止應用程式或元件連結至無效版本的組件。 強名稱元件也允許同一部計算機上存在多個版本的檔案,並供應用程式使用。 如需詳細資訊,請參閱 Strong-Named 元件

  • 版本感知程式碼儲存。

    .NET Framework 提供版本感知的程式碼儲存於全域組件快取中。 全域程式集緩存是已安裝 .NET Framework 之所有電腦上的全計算機程式代碼快取。 它會根據版本、文化特性和發行者資訊儲存元件,並支援多個版本的元件和應用程式。 如需詳細資訊,請參閱 全域程式集緩存

  • 隔離。

    使用 .NET Framework,您可以建立隔離執行的應用程式和元件。 隔離是並存執行的基本元件。 它牽涉到瞭解您使用的資源,並在多個應用程式或元件版本之間信賴地共用資源。 隔離也包括以版本特定的方式儲存檔案。 如需有關隔離的詳細資訊,請參閱建立並行執行元件的指導方針

版本相容性

.NET Framework 1.0 和 1.1 版的設計目的是彼此相容。 使用 .NET Framework 1.0 版建置的應用程式應該在 1.1 版上執行,而以 .NET Framework 1.1 版建置的應用程式應在 1.0 版上執行。 不過請注意,.NET Framework 1.1 版中新增的 API 功能不適用於 .NET Framework 1.0 版。 使用 2.0 版建立的應用程式只會在 2.0 版上執行。 2.0 版應用程式將不會在 1.1 版或更早版本上執行。

.NET Framework 的版本會被視為包含執行階段及其相關聯的 .NET Framework 程式集的單一單位(此概念稱為程式集統一)。 您可以將元件系結重新導向至包含其他 .NET Framework 元件版本,但覆寫預設元件系結可能會有風險,而且必須在部署之前經過嚴格測試。

尋找執行階段版本資訊

應用程式或元件編譯的運行時間版本,以及應用程式執行所需的運行時間版本資訊會儲存在兩個位置。 編譯應用程式或元件時,用來編譯它的運行時間版本資訊會儲存在Managed可執行檔中。 應用程式或元件所需的運行時間版本資訊會儲存在應用程式組態檔中。

Managed 可執行檔中的運行時間版本資訊

每個受控應用程式和元件的可攜式可執行檔 (PE) 檔案標頭包含它所建置之運行時間版本的相關信息。 通用語言執行時會使用這項資訊來判斷應用程式所需執行的最合適的執行階段版本。

應用程式組態檔中的運行時間版本資訊

除了PE檔案標頭中的資訊之外,還可以使用提供運行時間版本資訊的應用程式組態檔來部署應用程式。 應用程式組態檔是應用程式開發人員所建立且隨附於應用程式的 XML 型檔案。 <requiredRuntime> 如果該區段的元素<startup>存在於此檔案中,則指定執行時版本及應用程式支援的元件版本。 您也可以在測試中使用此檔案來測試應用程式與不同版本運行時間的相容性。

非受控代碼,包括 COM 和 COM+ 應用程式,可以有應用程式組態檔,這些檔案由執行階段用來與受控代碼互動。 應用程式組態檔會影響您透過 COM 啟用的任何 Managed 程式代碼。 檔案可以指定其支援的執行階段版本,以及組件重定向。 根據預設,呼叫 managed 碼的 COM Interop 應用程式會使用電腦上的最新版執行階段。

如需應用程式組態檔的詳細資訊,請參閱 設定應用程式

判斷要載入的運行時間版本

Common Language Runtime 會使用下列資訊來決定要為應用程式載入哪個版本的執行階段:

  • 可用的運行時間版本。

  • 應用程式支援的運行時間版本。

支援的執行階段版本

運行時間會使用應用程式組態檔和可攜式可執行檔 (PE) 檔案標頭來判斷應用程式支援的運行時間版本。 如果沒有應用程式組態檔存在,運行時間會載入應用程式PE檔案標頭中指定的運行時間版本,如果有該版本可用。

如果應用程式組態檔存在,運行時間會根據下列程序的結果決定要載入的適當運行時間版本:

  1. 執行時會<supportedRuntime>檢視應用程式設定檔中的元素。 如果元素中指定的 <supportedRuntime> 一個或多個支援的執行時版本存在,執行時會載入第一個 <supportedRuntime> 元素指定的執行時版本。 若此版本無法使用,執行時會檢查下一個 <supportedRuntime> 元素並嘗試載入指定的執行時版本。 若此執行時版本無法取得,則會檢視後續 <supportedRuntime> 元素。 如果沒有支援的運行時間版本可用,運行時間就無法載入運行時間版本,並向使用者顯示訊息(請參閱步驟 3)。

  2. 運行時間會讀取應用程式可執行檔的PE檔案標頭。 如果 PE 檔案標頭指定的執行時間版本可用,運行時間會載入該版本。 如果指定的運行時間版本無法使用,運行時間會搜尋 Microsoft 確定與 PE 標頭中的運行時間版本相容的運行時間版本。 如果找不到該版本,程式會繼續執行步驟 3。

  3. 運行時間會顯示訊息,指出應用程式支援的運行時間版本無法使用。 運行時間尚未載入。

    備註

    您可以透過使用登錄機碼 HKLM\Software\Microsoft\.NETFramework 下的 NoGuiFromShim 值或使用環境變數 COMPLUS_NoGuiFromShim 來抑制此訊息的顯示。 例如,您可以隱藏通常不會與使用者互動的應用程式訊息,例如自動安裝或 Windows 服務。 隱藏此訊息顯示時,運行時間會將訊息寫入事件記錄檔。 將登錄值 NoGuiFromShim 設定為 1,以隱藏電腦上所有應用程式的此訊息。 或者,將環境變數 COMPLUS_NoGuiFromShim 設定為 1,以抑制在特定使用者環境中執行的應用程式顯示訊息。

備註

載入執行階段版本之後,元件繫結重定向可以指定載入特定 .NET Framework 元件的不同版本。 這些系結重新導向只會影響重新導向的特定元件。

部分限定元件名稱和並存執行

因為它們是並存問題的潛在來源,所以部分限定的元件參考只能用來繫結至應用程式目錄中的元件。 請避免在程式碼中使用部分限定的程式集參考。

若要減輕程式碼中部分限定的組件參考,您可以使用應用程式組態檔中的 <qualifyAssembly> 元素,以完整限定程式碼中出現的部分限定組件參考。 使用該 <qualifyAssembly> 元素只指定部分參考中未設定的欄位。 屬性中 fullName 列出的組件識別必須包含完全限定組件名稱所需的所有資訊:組件名稱、公鑰、文化和版本。

以下範例顯示應用程式組態檔案中的項目,以完整描述名為myAssembly的元件。

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="myAssembly"
fullName="myAssembly,
      version=1.0.0.0,
publicKeyToken=...,
      culture=neutral"/>
</assemblyBinding>

每當組件載入敘述參考 myAssembly 時,這些組態檔設定會導致執行階段自動將部分限定名稱 myAssembly 參考轉換為完整名稱參考。 例如,Assembly.Load(“myAssembly”) 會變成 Assembly.Load(“myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral” )。

備註

你可以用這個 LoadWithPartialName 方法繞過通用語言執行時的限制,該限制禁止部分引用的組件從全域組合快取載入。 這個方法應該只在遠端情境中使用,因為它容易在並列執行中造成問題。

標題 說明
如何:啟用和停用自動系結重新導向 描述如何將應用程式系結至元件的特定版本。
設定元件系結重新導向 說明如何將元件系結參考重新導向至特定版本的 .NET Framework 元件。
In-Process 同步執行 討論如何使用進程內並行運行時主機激活,在單一進程中運行多個版本的CLR。
.NET 中的 組件 提供組件的概念概述。
應用程式定義域 提供應用程式域的概念概觀。

參考文獻

<supportedRuntime> 元素