2009-02-20 7 views
6

AppDomain.AssemblyResolveAppDomain.ReflectionOnlyAssemblyResolveイベントにフックすることで、いくつかのモジュールを読み込もうとしています。私が前者を働かせている間、私は後者に悲惨に失敗します。私は、この小さなプログラムにまで私の問題を煮ました:Assembly.ReflectionOnlyLoadにしようとしたときにこのプログラムを実行するAssembly.ReflectionOnlyLoadを試すときにReflectionOnlyAssemblyResolveが実行されないのはなぜですか?

public static class AssemblyLoader 
{ 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += 
      ReflectionOnlyAssemblyResolve; 

     // fails with FileNotFoundException 
     Assembly.ReflectionOnlyLoad("Foo"); 
    } 

    public static Assembly ReflectionOnlyAssemblyResolve(object sender, 
     ResolveEventArgs args) 
    { 
     Trace.TraceInformation(
      "Failed resolving Assembly {0} for reflection", args.Name); 

     return null; 
    } 
} 

FileNotFoundExceptionで失敗したが、それはReflectionOnlyAssemblyResolveハンドラを呼び出すことはありません。私はそこでかなり困惑している。

誰かがこれの根本的な原因となる可能性があり、これを動作させる方法を知っていますか?

ありがとうございます!

答えて

8

ここに示されているようにトップレベルのアセンブリ、ReflectionOnlyAssemblyResolveイベントのみ依存関係を解決するために使用されていることではないと思われる:

http://codeidol.com/csharp/net-framework/Assemblies,-Loading,-and-Deployment/Assembly-Loading/

そしてここに:

拡大

http://blogs.msdn.com/junfeng/archive/2004/08/24/219691.aspx

+0

アセンブリの反射のみの読み込みで失敗した試行を傍受する方法はありますか? – derabbink

+0

@derabbinkそれは別の質問です、私は想像します。 – casperOne

0

casperOneの答えに。

直接Assembly Resolveイベントをインターセプトする場合は、AppDomain.AssemblyResolveイベントにフックする必要があります。これはグローバルフックなので、それだけではあなたのシナリオに合っていません。しかし、アプリケーションがシングルスレッドの場合、特定の解決イベントをインターセプトするために短期間の接続が可能です。

+0

ReflectionOnlyLoad()の使用時にAssemblyResolveがトリガされません。 ReflectionOnlyLoad()のユーザーが必要としていないアセンブリを読み込むのを避けるため、これはわかりました。私はまだその見解に完全に同意するかどうかはわかりません。 –

関連する問題