たとえば、このドキュメントを読んで、私がこれまでに理解したことから: 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) アセンブリがロックされるのはいつですか? つまり、シャドウ コピーが便利な機能である場合は?
よろしくお願いします。