アセンブリに(永続的に)アプリケーションにロードせずにアセンブリの一部のメタデータをチェックしようとしています。これを行うために、私は一時的なAppDomainを作成し、その中にアセンブリをロードしてから全体をアンロードします。 this questionへの答えによると、それは "正しい"方法です。AppDomain.Unloadはアセンブリをアンロードしません
ただし、アセンブリをアンロードした後も、現在のAppDomainに残ります。どうして?
this questionへの回答は、アセンブリが現在のドメインに「流出」する可能性があることを示唆していますが、私の例ではこれがどうして可能かわかりません。残りのアプリケーションはアセンブリをまったく使用しません。参照さえされません。アセンブリロード直後にsandobx
をアンロードしても、観察された動作が維持されます。
This articleは、このようにドメイン中立性アセンブリをアンロードできないと言います。それが理由ですか?はいの場合、どういうわけか、アセンブリがドメイン中立として扱われるのを止めることはできますか?
private void Check()
{
string assemblyName = "SomeUnrelatedAssembly";
var sandbox = AppDomain.CreateDomain("sandbox"); //create a discardable AppDomain
//load the assembly to the sandbox
byte[] arr;
using (var memoryStream = new MemoryStream())
{
using (var fileStream = new FileStream($"{assemblyName}.dll", FileMode.Open))
fileStream.CopyTo(memoryStream);
arr = memoryStream.ToArray();
}
Console.WriteLine(IsAssemblyLoaded(assemblyName)); //prints false
sandbox.Load(arr);
//and unload it
AppDomain.Unload(sandbox);
Console.WriteLine(IsAssemblyLoaded(assemblyName)); //prints true!
}
private static bool IsAssemblyLoaded(string assemblyName)
{
return AppDomain.CurrentDomain.GetAssemblies().Any(a => a.FullName.Contains(assemblyName));
}
EDIT:私は(thisのような)プロセスエクスプローラでのロード・プロセスをチェックしました。ロードされたアセンブリはドメイン中立ではありません。
できますが、私たちに何を表示する '/ /チェックsom eのメタデータのコードは?サンドボックスドメインにアセンブリをロードしても、現在のドメインのメタデータを参照する可能性があります。 –
'sanbox.Load'と' AppDomain.Unload'命令の間に何もない場合でも、動作は同じです。 – tearvisus