陰影複製組件
注意
本文專屬於 .NET Framework。 其不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。
陰影複製可讓應用程式定義域中使用的組件更新,而不需卸載應用程式定義域。 這對必須連續運作的應用程式特別有用,例如 ASP.NET 網站。
重要
Windows 8.x 市集應用程式不支援陰影複製。
Common Language Runtime 在載入組件時會鎖定組件檔案,因此在卸載組件之前無法更新檔案。 若要從應用程式定義域卸載組件,唯一的方式為卸載應用程式定義域,如此在正常情況下,就無法在磁碟上更新組件,直到使用組件的所有應用程式定義域已卸載為止。
當設定應用程式定義域來陰影複製檔案時,會從應用程式路徑複製組件到另一個位置,並從該位置載入。 複本會遭到鎖定,但原始組件檔已解除鎖定,而且可以更新。
重要
唯一可以進行陰影複製的組件是儲存在應用程式目錄或其子目錄的,在設定應用程式定義域時可由 ApplicationBase 和 PrivateBinPath 屬性指定。 儲存在全域組件快取的組件不會進行陰影複製。
本文包含下列章節:
啟用和使用陰影複製描述基本的用法,以及陰影複製可用的選項。
啟動效能描述為了在 .NET Framework 4 中陰影複製而進行的變更,以改善啟動效能,也描述如何還原為舊版的行為。
已淘汰方法會描述對 .NET Framework 2.0 中控制陰影複製屬性和方法所進行的變更。
啟用及使用陰影複製
您可以使用 AppDomainSetup 類別的屬性,如下所示,設定用於陰影複製的應用程式定義域:
將 ShadowCopyFiles 屬性設為字串值
"true"
來啟用陰影複製。根據預設,在載入組件之前,此設定會複製在應用程式路徑的所有組件到下載快取。 這與 Common Language Runtime 所維護的快取相同,用以儲存從其他電腦下載的檔案,而且當這些檔案不再必需時,Common Language Runtime 會自動刪除這些檔案。
使用 CachePath 屬性和 ApplicationName 屬性,選擇性地設定用於陰影複製檔案的自訂位置。
藉由串連 ApplicationName 屬性至 CachePath 屬性做為子目錄,形成此位置的基底路徑。 這會陰影複製組件到這個路徑的子目錄,而非本身的基底路徑。
注意
如果未設定 ApplicationName 屬性,則會忽略 CachePath 屬性,並使用下載快取。 不會擲回任何例外狀況。
如果您指定自訂位置,則當您不再需要檔案時,要負責清除目錄及複製檔案。 它們不會自動刪除。
有幾個理由可能會讓您想設定陰影複製檔案的自訂位置。 如果您的應用程式會產生大量的複本,則您可能會想要設定陰影複製檔案的自訂位置。 下載快取會受大小所限制,而非存留期,因此 Common Language Runtime 很可能會嘗試刪除仍在使用中的檔案。 設定自訂位置的另一個理由是執行您應用程式的使用者沒有寫入權限,來寫入 Common Language Runtime 為下載快取所使用的目錄位置。
使用 ShadowCopyDirectories 屬性來選擇性地限制陰影複製的組件。
當您啟用應用程式定義域的陰影複製時,預設會複製所有組件到應用程式路徑中;也就是 ApplicationBase 和 PrivateBinPath 屬性所指定的目錄中。 您可以藉由建立字串限制所選目錄的複製,該字串只包含您想要陰影複製的目錄,並指派字串至 ShadowCopyDirectories 屬性。 請以分號分隔目錄。 只會對在所選目錄中的組件陰影複製。
注意
如果您不指派字串給 ShadowCopyDirectories 屬性,或如果您將這個屬性設定為
null
,則會陰影複製 ApplicationBase 和 PrivateBinPath 屬性所指定目錄中的所有組件。重要
目錄路徑不可包含分號,因為分號是分隔符號字元。 分號沒有逸出字元。
啟動效能
當使用陰影複製的應用程式定義域啟動時,複製應用程式目錄中的組件到陰影複製目錄會有延遲;或當組件已經在該位置時,驗證組件也會有延遲。 在 .NET Framework 4 之前,系統會將所有組件複製到暫存目錄。 會開啟每個組件來確認組件名稱,且會驗證強式名稱。 會檢查每個組件,以查看它是否已更新為比陰影複製目錄中的複本還要新。 若是如此,則將它複製到陰影複製目錄中。 最後會捨棄暫時複本。
從 .NET Framework 4 開始,預設啟動行為會直接比較應用程式目錄中每個組件的檔案日期和時間,以及陰影複製目錄中複本的檔案日期和時間。 如果已更新組件,便會使用和舊版 .NET Framework 相同的程序複製組件;否則會載入陰影複製目錄中的複本。
對於組件不常變更,且變更通常發生在組件一小部分的應用程式而言,會產生最大的效能改進。 如果應用程式中大部分的組件經常變更,則新的預設行為可能會導致效能變差。 您可以藉由將 <shadowCopyVerifyByTimestamp> 元素 (並設定 enabled="false"
) 新增至組態檔,還原舊版 .NET Framework 的啟動行為。
已淘汰的方法
AppDomain 類別有幾種方法,例如 SetShadowCopyFiles 和 ClearShadowCopyPath,可用來控制應用程式定義域上的陰影複製,但這些已經在 .NET Framework 2.0 版中標記為已淘汰。 建議使用 AppDomainSetup 類別的屬性來設定用於陰影複製的應用程式定義域。