2009-08-03 7 views
1

Créer une nouvelle appdomain, la configuration du gestionnaire AssemblyResolve et vous obtenez toujours une exception disant « assemblage [courant qui exécute l'assemblage] non trouvé »Exception mise en place de gestionnaire pour AppDomain.AssemblyResolve

ce qui donne? le code est ci-dessous

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; 

} 

exception:

System.IO.FileNotFoundException: Impossible de charger le fichier ou l'assembly 'appAdmin, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' ou un de ses dépendances. Le système ne peut pas trouver le fichier spécifié. Nom du fichier: 'appAdmin, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null' [snip]

+1

Ce n'est pas vraiment une question cohérente. vous ne montrez pas le contenu de sandBox_AssemblyResolve pour un début. Maintenant, ce que vous croyez le résultat devrait être, ni le statcktrace – ShuggyCoUk

+0

est-il plus clair maintenant? l'erreur est mise en place le gestionnaire d'événements => Assembly.AssemblyResolve + = new .... le reste n'a même pas la chance d'exécuter !! C'est pourquoi je ne l'ai pas copié plus tôt! – Kumar

Répondre

1

Votre résolveur ne peut pas se déclencher sur votre nouvel AppDomain, essayez plutôt de le définir sur AppDomain.CurrentAppDomain.

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

Dans la méthode sandBox_AssemblyResolve, vous pouvez charger l'assemblage à partir de n'importe quel répertoire, c'est là que la charge d'un byte [] peut entrer en jeu.

En ce qui concerne le chargement d'une Assemblée par l'octet [] ce résout les problèmes de verrouillage de fichier, il ne résoudra pas ce qui vous indispose je ne pense pas voir here

1

Vous essayez de charger des assemblys qui ne se trouvent pas sous l'emplacement de base de l'AppDomain. Je n'ai jamais eu l'événement AssemblyResolve pour moi non plus.

Je suggère de charger votre ensemble out-of-base dans un tableau d'octets (System.IO.File.ReadAllBytes), puis de remettre ce tableau to your newly created AppDomain to load.