2009-02-20 15 views
6

Próbuję załadować kilka modułów poprzez zahaczanie o zdarzenia AppDomain.AssemblyResolve i AppDomain.ReflectionOnlyAssemblyResolve. Kiedy zatrudniłem tę pierwszą do pracy, nieszczęsna mi jest ta ostatnia. Ja gotuje mój problem w dół do tego małego programu:Dlaczego funkcja ReflectionOnlyAssemblyResolve nie jest wykonywana podczas próby Assembly.ReflectionOnlyLoad?

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; 
    } 
} 

Uruchomienie tego programu nie powiedzie się z FileNotFoundException podczas próby Assembly.ReflectionOnlyLoad, ale nie wywołuje procedurę obsługi ReflectionOnlyAssemblyResolve. Jestem tam bardzo zaskoczony.

Czy ktoś ma pomysł, co może być przyczyną tego i jak to działa?

Dzięki!

Odpowiedz

8

wydaje się, że zdarzenie ReflectionOnlyAssemblyResolve służy wyłącznie do rozwiązywania zależności, a nie zespoły najwyższego poziomu, jak wskazano tutaj:

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

A tutaj:

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

+0

Czy istnieje sposób na przechwycenie niepowodzenia w próbie załadowania tylko odbiciem zespołu? – derabbink

+0

@derabbink To osobne pytanie, wyobrażam sobie. – casperOne

0

Rozszerzanie na odpowiedź casperOne.

Jeśli chcesz przechwycić bezpośrednie zdarzenia montażu, musisz wziąć udział w zdarzeniu AppDomain.AssemblyResolve. To globalny haczyk, więc sam nie pasuje do twojego scenariusza. Jeśli jednak twoja aplikacja jest pojedyncza, możesz połączyć się w krótkim czasie, aby przechwycić określone zdarzenia rozwiązywania problemów.

static void LoadWithIntercept(string assemblyName) { 
    var domain = AppDomain.CurrentDomain; 
    domain.AssemblyResolve += MyInterceptMethod; 
    try { 
    Assembly.ReflectionOnlyLoad(assemblyName); 
    } finally { 
    domain.AssemblyResolve -= MyInterceptMethod; 
    } 
} 

private static Assembly MyInterceptMethod(object sender, ResolveEventArgs e) { 
// do custom code here 
} 
+0

AssemblyResolve nie jest wyzwalane przy użyciu ReflectionOnlyLoad(). Jak zrozumiałem, jest to zgodne z projektem, aby uniknąć ładowania zestawów, które nie są "poszukiwane" przez użytkownika ReflectionOnlyLoad(). Nie jestem jeszcze pewien, czy całkowicie zgadzam się z tym punktem widzenia. –

Powiązane problemy