アセンブリのシャドウ コピー
シャドウ コピーを使用すると、アプリケーション ドメインで使用されているアセンブリを、アプリケーション ドメインをアンロードせずに更新できます。 この機能は、ASP.NET サイトのような途切れずに稼働させる必要があるアプリケーションに特に役立ちます。
アセンブリが読み込まれるときに共通言語ランタイムがアセンブリ ファイルをロックするため、アセンブリがアンロードされるまでそのファイルは更新できません。 アプリケーション ドメインからアセンブリをアンロードする唯一の方法は、アプリケーション ドメインをアンロードすることです。このため、通常の状況では、アセンブリを使用しているすべてのアプリケーション ドメインがアンロードされるまで、ディスク上でアセンブリを更新できません。
アプリケーション ドメインがファイルをシャドウ コピーするように構成されている場合は、アプリケーション パスにあるアセンブリが別の場所にコピーされ、その場所から読み込まれます。 このコピーはロックされますが、元のアセンブリ ファイルはロックされず、更新できます。
![]() |
---|
シャドウ コピーできるアセンブリは、アプリケーション ディレクトリまたはそのサブディレクトリに格納されているアセンブリに限られます。これらのディレクトリは、アプリケーション ドメインが構成されるときに、ApplicationBase プロパティと PrivateBinPath プロパティで指定されます。グローバル アセンブリ キャッシュに格納されているアセンブリは、シャドウ コピーされません。 |
この記事は、次のセクションで構成されています。
「シャドウ コピーの有効化と使用」では、シャドウ コピーの基本的な使用方法と使用可能なオプションについて説明します。
「起動時のパフォーマンス」では、起動時のパフォーマンスを向上させるために .NET Framework Version 4 のシャドウ コピーに対して行われた変更と、旧バージョンの動作に戻す方法について説明します。
「互換性のために残されているメソッド」では、.NET Framework 2.0 のシャドウ コピーを制御するプロパティとメソッドに対して行われた変更について説明します。
シャドウ コピーの有効化と使用
AppDomainSetup クラスのプロパティを次のように使用して、シャドウ コピーのアプリケーション ドメインを構成できます。
シャドウ コピーを有効にするために、ShadowCopyFiles プロパティを "true" という文字列値に設定します。
既定では、この設定によってアプリケーション パス内のすべてのアセンブリが、ダウンロード キャッシュにコピーされてから読み込まれるようになります。 このキャッシュは、共通言語ランタイムが他のコンピューターからダウンロードされたファイルを格納するために保持しているキャッシュと同じです。共通言語ランタイムは、不要になったファイルを自動的に削除します。
必要に応じて、シャドウ コピーされるファイルのカスタムの場所を、CachePath プロパティおよび ApplicationName プロパティを使用して設定します。
この場所を表す基本パスを構成するには、ApplicationName プロパティを、サブディレクトリである CachePath プロパティに連結します。 アセンブリは、基本パス自体ではなく、このパスのサブディレクトリにシャドウ コピーされます。
メモ
ApplicationName プロパティが設定されていない場合は、CachePath プロパティが無視され、ダウンロード キャッシュが使用されます。例外をスローすることはありません。
カスタムの場所を指定した場合は、ディレクトリおよびコピーされたファイルが不要になった時点で、それらを手動で削除する必要があります。 これらは自動的に削除されません。
シャドウ コピーされるファイルに対してカスタムの場所を設定するのには、いくつかの理由があります。 アプリケーションが大量のコピーを生成する場合は、シャドウ コピーされるファイルに対してカスタムの場所を設定する必要が生じることがあります。 ダウンロード キャッシュには、有効期間ではなくサイズ上の制限があります。このため、共通言語ランタイムがまだ使用中のファイルを削除しようとする可能性があります。 カスタムの場所を設定するもう 1 つの理由は、共通言語ランタイムがダウンロード キャッシュに使用するディレクトリの場所に対する書き込みアクセス権を、アプリケーションを実行するユーザーが持っていない場合があることです。
必要に応じて、シャドウ コピーされるアセンブリを、ShadowCopyDirectories プロパティを使用して制限します。
アプリケーション ドメインに対してシャドウ コピーを有効にすると、既定でアプリケーション パス内、つまり、ApplicationBase プロパティと PrivateBinPath プロパティによって指定されるディレクトリ内のすべてのアセンブリがコピーされます。 コピーの対象を選択したディレクトリに限定するには、シャドウ コピーするディレクトリのみを含めた文字列を作成し、その文字列を ShadowCopyDirectories プロパティに割り当てます。 ディレクトリ間は、セミコロン (;) で区切ります。 これで、シャドウ コピーされるアセンブリが、選択したディレクトリ内のアセンブリのみとなります。
重要
セミコロンは区切り記号文字であるため、ディレクトリ パスにセミコロンを含めることはできません。セミコロンのエスケープ文字はありません。
起動時のパフォーマンス
シャドウ コピーを使用するアプリケーション ドメインが開始する際に、アプリケーション ディレクトリ内のアセンブリがシャドウ コピー ディレクトリにコピーされるとき、または、アセンブリがその場所に既に存在する場合はアセンブリが検証されるときに、遅延が発生します。 .NET Framework 4 より前では、すべてのアセンブリが一時ディレクトリにコピーされていました。 各アセンブリが開かれてアセンブリ名が検証され、厳密な名前が検証されました。 各アセンブリがチェックされ、シャドウ コピー ディレクトリにあるコピーよりも後に更新されているかどうかが確認されました。 更新されている場合は、シャドウ コピー ディレクトリにコピーされました。 最後に、一時コピーが破棄されました。
.NET Framework 4 以降の起動時の既定の動作では、アプリケーション ディレクトリ内の各アセンブリのファイルの日時が、シャドウ コピー ディレクトリ内のコピーのファイルの日時と直接比較されます。 アセンブリが更新されている場合は、旧バージョンの .NET Framework と同じ手順を使用してコピーされます。更新されていない場合は、シャドウ コピー ディレクトリ内のコピーが読み込まれます。
その結果としてパフォーマンスが最大に向上するのは、アセンブリが頻繁には変更されず、通常はアセンブリの小さなサブセット内で変更が行われるアプリケーションです。 アプリケーションのアセンブリの大部分が頻繁に変更される場合は、新しい既定の動作によってパフォーマンスが低下することがあります。 enabled="false" を指定して構成ファイルに <shadowCopyVerifyByTimestamp> 要素を追加することで、以前のバージョンの .NET Framework の起動時の動作に戻すことができます。
互換性のために残されているメソッド
AppDomain クラスには、アプリケーション ドメインでのシャドウ コピーを制御するために使用できる SetShadowCopyFiles や ClearShadowCopyPath などのいくつかのメソッドがありますが、.NET Framework Version 2.0 では、これらのメソッドが互換性のために残されています。 アプリケーション ドメインをシャドウ コピー対応として構成する場合は、AppDomainSetup クラスのプロパティを使用する方法が推奨されます。
参照
参照
AppDomainSetup.ShadowCopyFiles
AppDomainSetup.ApplicationName
AppDomainSetup.ShadowCopyDirectories