7
votes

À la recherche de .NET Assembly dans un endroit différent

Comment puis-je dire à mon application .NET où chercher un assemblage particulier dont il a besoin (autre que le GAC ou le dossier où la demande est comprise)? Par exemple, je voudrais mettre un assemblage dans le dossier temporaire de l'utilisateur et que mon application sache que l'assemblage référencé est dans le dossier Temp.

merci


0 commentaires

3 Réponses :


3
votes

Voir cette discussion pour certaines des questions concernées:

http://bytes.com/topic/c -Sharp / Réponses / 248203-Dynamic-Assembly-Loading

Fondamentalement, vous ne pouvez pas changer l'appbase d'un AppDomain après avoir été créé. Vous devez le spécifier dans le cadre de la Configuration Avant de créer un nouveau, ce qui ne vous aidera pas dans la valeur par défaut AppDomain.

Si l'ensemble que vous souhaitez charger est dans un répertoire sous le courant appbase, vous pouvez ajouter son chemin relatif en utilisant le AppendPrivatePath (RelativePath), puis utiliser Assembly.load - le temps d'exécution va sonder les sous-répertoires pour vous. C'est le moyen le plus simple / le plus simple de gérer cela.


1 commentaires

Merci, tout comme une note que je n'ai pas besoin de le charger de manière dynamique. Je référencement l'Assemblée dans mon projet. Mais lorsque je déploie cette application, je souhaite que l'application sache que l'assemblage référencé sera dans le dossier Temp



2
votes
System.Reflection.Assembly.LoadFrom(myFile);
http://msdn.microsoft.com/en-us/library/1009fa28.aspxAnother alternative is to handle Assembly resolve events yourself as in this StackOverflow question: How to add folder to assembly search path at runtime in .NET?

0 commentaires

11
votes

Vous pouvez utiliser le AppDomain.assemblyResolve événement ajouter des résolveurs d'assemblage personnalisés. Cela vous permet de pointer sur d'autres répertoires ou même des bases de données pour obtenir des assemblages si nécessaire.

J'ai même utilisé du code similaire pour télécharger des assemblages dans une base de données et stocker dans IsolateStorage. Le nom du fichier en tant que hachage du nom de l'assemblage complet. Ensuite, la base de données n'aurait besoin de télécharger à la première fois que vous résoludez et toutes les résolutions futures seront desservies par le système de fichiers. Le meilleur à propos de l'événement AssemblyResolve est que vous pouvez l'utiliser Type.getType () et les sérialiseurs intégrés. P>

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


2 commentaires

Comme mentionné ici , utilisez String AssemblyName = nouveau Nom de l'Assemblée (Args.Name) Nom; au lieu d'utiliser divisé (',') .


Merci pour la suggestion.