6

たとえば、このドキュメントを読んで、私がこれまでに理解したことから: http://msdn.microsoft.com/en-us/library/ms404279.aspxシャドウ コピーは、現在アセンブリを使用できるようにする機能です。アプリケーションによってロードされます。

上記のドキュメントから:

共通言語ランタイムは、アセンブリが読み込まれるとアセンブリ ファイルをロックするため、アセンブリがアンロードされるまでファイルを更新できません。アプリケーション ドメインからアセンブリをアンロードする唯一の方法は、アプリケーション ドメインをアンロードすることです。そのため、通常の状況では、アセンブリを使用しているすべてのアプリケーション ドメインがアンロードされるまで、アセンブリをディスク上で更新できません。アプリケーション ドメインがファイルをシャドウ コピーするように構成されている場合、アプリケーション パスのアセンブリは別の場所にコピーされ、その場所から読み込まれます。コピーはロックされていますが、元のアセンブリ ファイルはロック解除されており、更新できます。

ただし、ロードされたアセンブリがロックされていない場合があるため、シャドウ コピーは役に立たないようです。

この点を説明するために、次のコードで単純なライブラリ A.dll を作成しました。

using System;

public class A
{
 public A()
 {
  Console.WriteLine("A");
 }
}

次に、次のようなコードを使用して AppDomain にロードします。

using System;
using System.Reflection;

class Test
{
 static void Main()
 {
  AppDomainSetup configuration = new AppDomainSetup
  {
   ShadowCopyFiles = "false"
  };

  AppDomain appDomain = AppDomain.CreateDomain("", null, configuration);

  Console.WriteLine(appDomain.ShadowCopyFiles);

  Assembly assembly = appDomain.Load("A");
  assembly.CreateInstance("A");

  Console.ReadLine();

  assembly.CreateInstance("A");
 }
}

したがって、プログラムがReadLineにハングアップしている間は A.dll アセンブリを使用できないはずですが、まったくロックされていないようです。削除することもできます。

だからここに私の質問があります:

1) このサンプルでは、​​ロードされたアセンブリがロックされていないのはなぜですか?

2) アセンブリがロックされるのはいつですか? つまり、シャドウ コピーが便利な機能である場合は?

よろしくお願いします。

4

1 に答える 1

4

シャドウ コピーは、アプリ ドメインの再起動時に役立ちます。たとえば。プログラムが独自のアプリ ドメインを使用して一連のプラグインを開始し、バックグラウンドで更新されたバージョンをダウンロードするとします。アプリ ドメインがシャドウ コピーを使用して開始された場合、プラグインの実装 DLL を更新してプラグインをリロードすると、アプリ ドメインの再起動によって新しいバージョンが取得されます。

于 2011-04-28T05:38:37.380 に答える