アセンブリのシャドウ コピー

シャドウ コピーにより、アプリケーション ドメインをアンロードしなくても、アプリケーション ドメインで使用されるアセンブリを更新できます。 これは、ASP.NET サイトなど、継続的に使用可能であることが必要なアプリケーションで特に役立ちます。

重要

シャドウ コピーは、Windows 8.x Store アプリではサポートされていません。

共通言語ランタイムは、アセンブリがアンロードされるまでファイルを更新できないように、アセンブリがロードされるときにアセンブリ ファイルをロックします。 アプリケーション ドメインからアセンブリをアンロードする唯一の方法は、アプリケーション ドメインをアンロードすることなので、通常の状況では、アセンブリを使用しているすべてのアプリケーション ドメインがアンロードされるまで、そのアセンブリをディスク上で更新することはできません。

ファイルをシャドウ コピーするようにアプリケーション ドメインが構成されると、アプリケーション パスからのアセンブリが別の場所にコピーされて、その場所から読み込まれます。 コピーはロックされますが、元のアセンブリ ファイルはロック解除されて、更新可能になります。

重要

シャドウ コピーが可能な唯一のアセンブリは、アプリケーション ドメインの構成時に ApplicationBase または PrivateBinPath プロパティで指定された、アプリケーション ディレクトリやそのサブディレクトリに保存されているものです。 グローバル アセンブリ キャッシュに格納されているアセンブリは、シャドウ コピーされません。

この記事は、次のセクションで構成されています。

  • シャドウ コピーの有効化と使用」では、シャドウ コピーの基本的な使用方法と使用可能なオプションについて説明します。

  • 起動時のパフォーマンス」では、起動時のパフォーマンスを改善するために .NET Framework 4 でシャドウ コピーに加えられた変更、および以前のバージョンの動作に戻す方法について説明します。

  • 廃止メソッド」では、.NET Framework 2.0 でシャドウ コピーを制御するためにプロパティとメソッドに加えられた変更について説明します。

シャドウ コピーの有効化と使用

AppDomainSetup クラスのプロパティを以下のように使用して、シャドウ コピー用のアプリケーション ドメインを構成できます。

  • ShadowCopyFiles プロパティを文字列値に "true" に設定して、シャドウ コピーを有効にします。

    既定では、この設定は、アプリケーション パス内のすべてのアセンブリを、それらが読み込まれる前にダウンロード キャッシュにコピーします。 これは、他のコンピューターからダウンロードしたファイルを格納するために共通言語ランタイムによって保守されるものと同じキャッシュで、不要になったときには、共通言語ランタイムが自動的にファイルを削除します。

  • 必要に応じて、CachePath プロパティと ApplicationName プロパティを使用して、シャドウ コピーしたファイルのカスタムの場所を設定します。

    この場所の基本パスは、ApplicationName プロパティに CachePath プロパティをサブディレクトリとして連結することにより形成されます。 アセンブリは、基本パス自体ではなく、このパスのサブディレクトリにシャドウ コピーされます。

    Note

    ApplicationName プロパティが設定されていない場合、CachePath プロパティは無視されて、ダウンロード キャッシュが使用されます。 例外をスローすることはありません。

    カスタムの場所を指定する場合は、不要になったときに、ディレクトリとコピー済みファイルをユーザーがクリーンアップする必要があります。 それらは自動的には削除されません。

    シャドウ コピーされるファイル用にカスタムの場所を設定すると良いいくつかの理由があります。 アプリケーションが生成するコピーの数が多い場合は、シャドウ コピーされるファイル用にカスタムの場所を設定することができます。 ダウンロード キャッシュは有効期間ではなくサイズによって制限されるので、共通言語ランタイムが、まだ使用されているファイルを削除しようとする可能性があります。 カスタムの場所を設定するもう 1 つの状況は、アプリケーションを実行しているユーザーに、共通言語ランタイムがダウンロード キャッシュ用に使用するディレクトリの場所に対する書き込みアクセス権がない場合です。

  • 必要に応じて、ShadowCopyDirectories プロパティを使用して、シャドウ コピーするアセンブリの数を制限します。

    アプリケーション ドメインのシャドウ コピーを有効にすると、既定では、アプリケーション パス内の、つまり ApplicationBasePrivateBinPath プロパティで指定されたディレクトリ内の、すべてのアセンブリがコピーされます。 シャドウ コピーするディレクトリのみを含む文字列を作成して、その文字列を ShadowCopyDirectories プロパティに割り当てることにより、コピー操作を選択したディレクトリに制限できます。 ディレクトリをセミコロンで区切ります。 シャドウ コピーされるアセンブリは、選択したディレクトリ内のものだけです。

    Note

    文字列を ShadowCopyDirectories プロパティに割り当てない場合、またはこのプロパティを null に設定した場合は、ApplicationBasePrivateBinPath プロパティで指定したディレクトリ内のすべてのアセンブリがシャドウ コピーされます。

    重要

    セミコロンは区切り文字なので、ディレクトリ パスにはセミコロンを含めないでください。 セミコロンのためのエスケープ文字はありません。

起動時のパフォーマンス

シャドウ コピーを使用するアプリケーション ドメインを開始するときには、アプリケーション ディレクトリ内のアセンブリをシャドウ コピー ディレクトリにコピーしたり、既にその場所にある場合には検証したりするので、遅延が生じます。 .NET Framework 4 の前には、すべてのアセンブリを一時ディレクトリにコピーしていました。 各アセンブリを開いて、アセンブリ名を確認し、厳密な名前は検証しました。 各アセンブリを検査して、シャドウ コピーのディレクトリにあるコピーよりも最近に更新されていないかどうかを調べました。 更新されていた場合、それはシャドウ コピーのディレクトリにコピーしました。 最後に、一時コピーを破棄しました。

.NET Framework 4 以降は、起動時の既定の動作として、アプリケーション ディレクトリ内にある各アセンブリのファイルの日時を、シャドウ コピーのディレクトリ内にあるコピーのファイルの日時と直接比較します。 アセンブリが更新されている場合は、.NET Framework の以前のバージョンと同じ手順を使用してそれをコピーし、そうでない場合は、シャドウ コピーのディレクトリ内にあるコピーが読み込まれます。

結果としてのパフォーマンスの改善は、アセンブリの変更頻度が小さく、通常はアセンブリの小さなサブセット内で変更が生じるようなアプリケーションで最大となります。 アプリケーション内のアセンブリの大部分が頻繁に変更される場合は、新しい既定動作によって、パフォーマンスが低下する可能性があります。 <shadowCopyVerifyByTimestamp> 要素を構成ファイルに enabled="false" と共に追加することによって、.NET Framework の以前のバージョンの起動動作を復元できます。

廃止メソッド

AppDomain クラスには、アプリケーション ドメインでシャドウ コピーを制御するために使用できる SetShadowCopyFilesClearShadowCopyPath などのいくつかのメソッドがありますが、これらは .NET Framework バージョン 2.0 では廃止された機能としてマークされています。 シャドウ コピー用にアプリケーション ドメインを構成するには、AppDomainSetup クラスのプロパティを使用することをお勧めします。

関連項目