1

新しい appdomain を作成し、assemblyResolve ハンドラーをセットアップすると、「アセンブリ [現在実行中のアセンブリ] が見つかりません」という例外が常に発生します。

何が得られますか?コードは以下です

string _fileName = @"c:\temp\abc123.dll";

AppDomain sandBox = AppDomain.CreateDomain("sandbox");

sandBox.AssemblyResolve += new ResolveEventHandler(sandBox_AssemblyResolve); 
// the line generates the exception !

System.Reflection.Assembly asm = sandBox.Load(System.Reflection.AssemblyName
                                     .GetAssemblyName(fileName).FullName);

foreach (System.Reflection.AssemblyName ar in asm.GetReferencedAssemblies())
    dbgWrite("Ref:  " + ar.FullName );


System.Reflection.Assembly sandBox_AssemblyResolve
  (object sender, ResolveEventArgs e)
{

    System.Reflection.Assembly asm = 
        System.Reflection.Assembly.LoadFrom(_fileName);
    return asm;

}

例外は次のとおりです。

System.IO.FileNotFoundException: ファイルまたはアセンブリ 'appAdmin、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。ファイル名: 'appAdmin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' [中略]

4

2 に答える 2

1

AppDomain のベースの場所にないアセンブリを読み込もうとしています。AssemblyResolve イベントが機能したこともありません。

ベース外アセンブリをバイト配列 (System.IO.File.ReadAllBytes) にロードし、その配列を新しく作成した AppDomain に渡して load することをお勧めします。

于 2009-08-24T14:18:38.383 に答える
1

リゾルバーは新しい AppDomain で起動しない可能性があります。代わりに AppDomain.CurrentAppDomain で設定してみてください。

AppDomain.CurrentDomain.AssemblyResolve += 新しい ResolveEventHandler(sandBox_AssemblyResolve);

sandBox_AssemblyResolve メソッドでは、任意のディレクトリからアセンブリをロードできます。ここで、byte[] からのロードが有効になります。

byte[] を使用したアセンブリのロードに関しては、これによりファイルのロックの問題が修正されますが、ここに表示されていないと思われる問題は修正されません

于 2009-09-03T16:11:13.340 に答える