2009-08-03 4 views
1

Erstellen Sie ein neues Appdomain, Setup der AssemblyResolve Handler und Sie immer eine Ausnahme erhalten sagen ‚assembly [aktuelle Assembly Ausführen] nicht gefunden‘Ausnahme Einrichtung Handler für AppDomain.AssemblyResolve

was ist passiert? Code ist unter

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; 

} 

Ausnahme ist:

System.IO.FileNotFoundException: Die Datei oder Assembly laden 'AppAdmin, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' oder eines ihrer Abhängigkeiten. Die angegebene Datei wurde vom System nicht gefunden. Dateiname: 'appAdmin, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' [snip]

+1

Das ist nicht wirklich eine zusammenhängende Frage sehen. Sie zeigen nicht den Inhalt von sandBox_AssemblyResolve für einen Start. Nun, was Sie glauben, das tatsächliche Ergebnis sollte, noch die volle statcktrace – ShuggyCoUk

+0

ist es jetzt klarer? der Fehler ist die Einrichtung der Event-Handler => Assembly.AssemblyResolve + = neu .... der Rest bekommt nicht einmal eine Chance zur Ausführung !! deshalb habe ich es vorher nicht kopiert! – Kumar

Antwort

1

Ihr Resolver wird möglicherweise nicht auf Ihrer neuen Anwendungsdomäne ausgelöst, versuchen Sie es stattdessen in der AppDomain.CurrentAppDomain.

AppDomain.CurrentDomain.AssemblyResolve + = neuer ResolveEventHandler (sandBox_AssemblyResolve);

In der Methode "sandBox_AssemblyResolve" können Sie die Assembly aus den Verzeichnissen laden, die Sie möchten. Hier kann die Ladung von einem Byte [] ins Spiel kommen.

Was das Laden einer Assembly mit byte [] Diese Datei Sperr behebt, wird es nicht reparieren, was ist dir Ich glaube nicht, here

1

Sie versuchen, Assemblys zu laden, die sich nicht unter dem Standort der AppDomain befinden. Ich habe das AssemblyResolve Event nie für mich arbeiten lassen.

Ich würde vorschlagen, Ihre Out-of-Base-Assembly in ein Byte-Array (System.IO.File.ReadAllBytes) zu laden und dann dieses Array to your newly created AppDomain to load übergeben.