陰影複製組件
陰影複製可以在不需卸載應用程式定義域的情況下,直接更新應用程式定義域中使用的組件。 這個功能對於必須持續可用的應用程式 (例如 ASP.NET 網站) 非常有幫助。
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 屬性,並使用下載快取。不會擲回例外狀況。
如果您指定了自訂位置,您必須在不再需要目錄和複製的檔案時,負責清除它們, 而不會將其自動刪除。
您想要針對陰影複製的檔案設定自訂位置可能有幾個理由。 如果您的應用程式產生了大量的複本,您可能想要為陰影複製檔案設定自訂位置。 下載快取會受到大小的限制,而不是存留期 (Lifetime) 的限制,因此,Common Language Runtime 可能會嘗試刪除仍在使用中的檔案。 另一個設定自訂位置的原因是當執行應用程式的使用者對於 Common Language Runtime 用於下載快取的目錄位置不具有寫入存取權限時。
選擇性地使用 ShadowCopyDirectories 屬性來限制陰影複製的組件。
當您為某個應用程式定義域啟用陰影複製時,預設會複製應用程式路徑內 (即 ApplicationBase 和 PrivateBinPath 屬性所指定的目錄) 的所有組件。 您可以建立只包含您想要陰影複製之目錄的字串,並將此字串指派給 ShadowCopyDirectories 屬性,以將複製作業限定在選取的目錄。 請用分號分隔目錄。 此時只會針對選定目錄內的組件進行陰影複製。
重要事項 目錄路徑不可包含冒號,因為冒號是分隔符號字元。冒號沒有逸出字元。
啟動效能
當使用陰影複製的應用程式定義域啟動時,會有一段延遲時間,讓應用程式目錄中的組件複製到陰影複製目錄,或是確認應用程式目錄中的組件是否已經存在該位置。 在 .NET Framework 4 之前,所有組件都是複製到暫存目錄。 那時會開啟每個組件來確認組件名稱,而強式名稱是會被認為是有效的名稱。 那時會檢查每個組件,看看組件的更新時間是否比陰影複製目錄中的複本還新。 若是如此,就會將組件會複製到陰影複製目錄。 最後,就會捨棄暫存複本。
從 .NET Framework 4 開始,預設啟動行為是直接將應用程式目錄中每個組件的檔案日期和時間與陰影複製目錄中之複本的檔案日期和時間進行比較。 如果組件已經更新,就會仿照舊版 .NET Framework 中的程序來複製該組件,否則就會載入陰影複製目錄中的複本。
如果應用程式的組件不常變更,而且變更通常只發生在一小部分組件,最後的效能改善效果會最大。 如果應用程式中大部分的組件都經常變更,則這項新的預設行為可能會導致效能衰退。 您可以藉由將 <shadowCopyVerifyByTimestamp> 項目 (並設定 enabled="false") 加入至組態檔,還原舊版 .NET Framework 的啟動行為。
已經過時的方法
AppDomain 類別包含可在應用程式定義域上用來控制陰影複製的數個方法 (例如 SetShadowCopyFiles 和 ClearShadowCopyPath),不過這些方法在 .NET Framework 2.0 版內已標記為過時。 設定應用程式定義域來進行陰影複製的建議方法是使用 AppDomainSetup 類別的屬性。
請參閱
參考
AppDomainSetup.ShadowCopyFiles
AppDomainSetup.ApplicationName
AppDomainSetup.ShadowCopyDirectories