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

注

この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。

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

Von Bedeutung

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

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

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

Von Bedeutung

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

この記事には、次のセクションが含まれています。

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

  • スタートアップ パフォーマンス では、起動パフォーマンスを向上させるために .NET Framework 4 でシャドウ コピーに加えられた変更と、以前のバージョンの動作に戻す方法について説明します。

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

シャドウコピーを有効化して使用する方法

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

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

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

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

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

    注

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

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

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

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

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

    注

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

    Von Bedeutung

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

スタートアップの業績

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

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

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

古いメソッド

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

こちらも参照ください