Question

    

Cette question a déjà une réponse ici:

         

Comment puis-je dire à mon application .NET où chercher un ensemble particulier dont elle a besoin (autre que le GAC ou le dossier dans lequel l'application va de)? Par exemple, je voudrais mettre un assemblage dans le dossier Temp de l'utilisateur et que ma demande soit savoir que l'Assemblée est référencé dans le dossier temp.

Merci

Était-ce utile?

La solution

vous pouvez utiliser l'événement AppDomain.AssemblyResolve pour ajouter des instructions résolveurs Assemblée. Cela vous permet de pointer d'autres répertoires ou bases de données même pour obtenir des assemblages selon les besoins.

J'ai même utilisé un code similaire pour télécharger des ensembles à partir d'une base de données et stocker dans IsolatedStorage. Le nom de fichier en tant que hachage du nom complet de l'Assemblée. Ensuite, la base de données aurait seulement besoin de télécharger la première fois que vous résolvez et toutes les futures résolutions seront servis par le système de fichiers. Le meilleur au sujet de l'événement est AssemblyResolve vous pouvez l'utiliser Type.GetType () et construit en Sérialiseurs.

static string lookupPath = @"c:\otherbin";

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += 
        new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

static Assembly CurrentDomain_AssemblyResolve(object sender, 
                                              ResolveEventArgs args)
{
    var assemblyname = new AssemblyName(args.Name).Name;
    var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
    var assembly = Assembly.LoadFrom(assemblyFileName);
    return assembly;
}

Autres conseils

Voir cette discussion pour certains des enjeux:

http://bytes.com/topic/c -sharp / réponses / 248203 -assemblage dynamique chargement

En fait, vous ne pouvez pas changer le Appbase d'un appdomain après qu'il a été créé. Vous devez le spécifier dans le cadre du configuration avant de créer une nouvelle, qui wont vous aider dans la valeur par défaut appdomain.

Si l'ensemble que vous voulez charger est dans un répertoire sous le courant Appbase vous pouvez ajouter le chemin relatif en utilisant la AppendPrivatePath (relativePath), puis utilisez Assembly.Load - le moteur d'exécution sondera les sous-répertoires pour vous. C'est le meilleur / moyen le plus facile à manipuler.

System.Reflection.Assembly.LoadFrom(myFile);

http://msdn.microsoft.com/en-us/library /1009fa28.aspx

Une autre alternative consiste à gérer résoudre vous-même les événements Assemblée comme dans cette question StackOverflow:

scroll top