2016-11-16 9 views
0

アセンブリに(永続的に)アプリケーションにロードせずにアセンブリの一部のメタデータをチェックしようとしています。これを行うために、私は一時的な​​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のような)プロセスエクスプローラでのロード・プロセスをチェックしました。ロードされたアセンブリはドメイン中立ではありません。

+0

できますが、私たちに何を表示する '/ /チェックsom eのメタデータのコードは?サンドボックスドメインにアセンブリをロードしても、現在のドメインのメタデータを参照する可能性があります。 –

+0

'sanbox.Load'と' AppDomain.Unload'命令の間に何もない場合でも、動作は同じです。 – tearvisus

答えて

0

あなたは正しいですか?あなたのアセンブリは、ドメインに依存しないとみなされ、アプリケーションドメイン間で共有されます。

セットアップ情報を提供することを可能にするAppDomain.CreateDomainのオーバーロードを使用します

情報を:

AppDomainSetup info = new AppDomainSetup(); 
info.ApplicationBase = domainDir; 
info.ApplicationName = executableNameNoExe; 
info.LoaderOptimization = LoaderOptimization.SingleDomain; 

変更:

AppDomain.CreateDomain("sandbox"); 

へ:

AppDomain.CreateDomain("sandbox",null, info); 
+0

残念ながら、それは動作しません。 2番目のチェックは、依然としてtrueを出力します。 – tearvisus

+0

'Check'コールの前に' IsAssemblyLoaded() 'を呼び出すとどうなりますか?以前ロードされているかもしれませんか? –

+0

「2番目のチェック」によって、2番目の「IsAssemblyLoaded」呼び出しを意味しました。この例の 'Check'メソッドは、正確に1回だけ呼び出されます。 – tearvisus

関連する問題