2013-06-20 11 views
6

どのようにしてappdomainを作成し、アセンブリを追加してから、そのアプリケーションドメインを破棄できますか?これは、私が試したものです:私も試してみましたカスタムAppDomainを作成してアセンブリを追加する

static void Main(string[] args) 
    {   
     string pathToExe = @"A:\Users\Tono\Desktop\ConsoleApplication1.exe"; 

     AppDomain myDomain = AppDomain.CreateDomain("MyDomain"); 

     Assembly a = Assembly.Load(System.IO.File.ReadAllBytes(pathToExe)); 

     myDomain.Load(a.FullName); // Crashes here!    
    } 

myDomain.Load(File.ReadAllBytes(pathToExe)); 

は、どのように私はのAppDomainにアセンブリを追加することができます。 、ConsoleApplication1、バージョン= 1.0.0.0」ファイルまたはアセンブリをロードできませんでした

:私は私が得る例外はある

を、それを実行し、その後のAppDomainを破棄反射によって方法を見つけることができません一度 カルチャ=ニュートラル、PublicKeyToken =ヌル 'またはその依存関係の1つ。 システムは、指定されたファイルを見つけることができません。

+2

public class SimpleAssemblyLoader : MarshalByRefObject { public void Load(string path) { ValidatePath(path); Assembly.Load(path); } public void LoadFrom(string path) { ValidatePath(path); Assembly.LoadFrom(path); } private void ValidatePath(string path) { if (path == null) throw new ArgumentNullException("path"); if (!System.IO.File.Exists(path)) throw new ArgumentException(String.Format("path \"{0}\" does not exist", path)); } } 

そして、そのようにそれを使用します。ここでは単純なものです他のドメインを使用して、必要なアセンブリをロードします(依存関係をあらかじめロードするかアセンブリの検索パスを正しく設定する必要があるかもしれないことを忘れないでください)。 –

+0

"またはその依存関係の1つ"が通常の問題です。それが何であるかわからない場合は、Fuslogvw.exeを使用してください。 AppDomainSetupを使用して、正しいプライベートパスを設定します。 –

答えて

11

二つの迅速なポイント:

  1. AppDomain.Load負荷現在のAppDomain内のアセンブリはなくmyDomainに(奇妙な、私は知っています)。
  2. AppDomain.Loadは、Loadコンテキストでアセンブリを読み込みます。このコンテキストは、アプリケーションbase-dir、プライベートbin-paths、およびGACからアセンブリを解決します。おそらく、ロードしようとしているアセンブリは、例外メッセージを説明するこれらの場所にはありません。

詳細はanswerをご覧ください。

アセンブリをAppDomainに読み込む1つの方法は、MarshalByRef由来のローダーを作成することです。タイプ(およびアセンブリ)がメインのAppDomainに漏れないように、このようなものが必要です。中にいくつかのコードを実行することを検討ので、代わりに他のドメインにアセンブリをプッシュしよう - あなた自身のドメインにアセンブリをロードすることが容易である

//Create the loader (a proxy). 
var assemblyLoader = (SimpleAssemblyLoader)myDomain.CreateInstanceAndUnwrap(typeof(SimpleAssemblyLoader).Assembly.FullName, typeof(SimpleAssemblyLoader).FullName); 
//Load an assembly in the LoadFrom context. Note that the Load context will 
//not work unless you correctly set the AppDomain base-dir and private-bin-paths. 
assemblyLoader.LoadFrom(pathToExe); 

//Do whatever you want to do. 

//Finally unload the AppDomain. 
AppDomain.Unload(myDomain); 
+0

こんにちは、私はちょうどいくつかの.netアセンブリのプリロードの種類にあなたの提案を使用して特定のインターフェイスクラスの実装が含まれているかどうかを調べようとしました。しかし、うまく動作する現在のドメインにアセンブリを読み込むのとは対照的に、新しく作成したAppDomain myDomainにアセンブリをロードすることはできません。 –

関連する問題