2009-10-13 7 views
6

Comment puis-je dire à mon application .NET où chercher un assembly particulier dont elle a besoin (autre que le GAC ou le dossier d'où l'application fonctionne)? Par exemple, je voudrais mettre un assembly dans le dossier Temp de l'utilisateur et faire savoir à mon application que l'assembly référencé se trouve dans le dossier temp.Vous cherchez .NET Assembly dans un endroit différent

Merci

Répondre

6

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

J'ai même utilisé un code similaire pour télécharger des assemblages depuis une base de données et les stocker dans IsolatedStorage. Le nom du fichier en tant que hash du nom complet de l'assembly. Ensuite, la base de données ne devra être téléchargée que lors de la première résolution et toutes les futures résolutions seront servies par le système de fichiers. Le meilleur à propos de l'événement AssemblyResolve est que vous pouvez l'utiliser Type.GetType() et les Serializers intégrés.

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

Comme mentionné [ici] (http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event- Tips), utilisez 'string assemblyname = new AssemblyName (args.Name) .Name;' au lieu d'utiliser 'Split (',')'. – kroimon

+0

Merci pour la suggestion. –

3

Voir cette discussion pour certains des enjeux:

http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading

Fondamentalement, vous ne pouvez pas changer le Appbase d'un appdomain après qu'il a été créé. Vous devez le spécifier dans la configuration avant d'en créer un nouveau, ce qui ne vous aidera pas dans le domaine par défaut .

Si l'ensemble que vous voulez charger est dans un répertoire sous la Appbase actuelle, 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 toi. C'est le meilleur moyen de le gérer.

+0

Merci, comme une note, je n'ai pas besoin de le charger dynamiquement. Je fais référence à l'assemblée dans mon projet. Mais quand je déploie cette application, je veux que l'application sache que l'assembly référencé sera dans le dossier temporaire –

Questions connexes