Accueil > .Net, C#, Développement > [C#] Charger des assemblies dans l’AppDomain

[C#] Charger des assemblies dans l’AppDomain

Comme indiqué dans mon billet [Sécurité] Chiffrer les données de configuration, le chiffrement de sections personnalisées peut parfois poser problème.
En effet, comme les assemblies liées à cette section ne sont pas forcément chargées dans l’AppDomain, il est possible de se retrouver avec une exception de type ConfigurationErrorsException ayant pour message :

Une erreur s’est produite lors de la création du gestionnaire de section de configuration pour XXXXX : Impossible de charger le fichier ou l’assembly ‘YYYYY, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9c321ad7c5c14ce7’ ou une de ses dépendances. Le fichier spécifié est introuvable. ([chemin_du_fichier_de_configuration]).

Que faire, alors ?
C’est ce que nous allons voir ici.

 
La source de ce problème est donc aisée à trouver et comprendre : l’application n’a pas connaissance de la section, donc elle ne sait pas quoi en faire.
Pour lui apporter cette connaissance, il suffit « juste » de lui indiquer où se trouve la description de la section.

Ici, nous allons travailler avec l’AppDomain.
Plus précisément le AppDomain.CurrentDomain.

Sur l’AppDomain, il y a un évènement nommé AssemblyResolve (EN) :

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentAppDomain_AssemblyResolve);

private Assembly CurrentAppDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
   //...
}

C’est donc dans cet évènement que nous allons devoir trouver et renvoyer l’assembly manquante, tout simplement.
La propriété Name de l’objet ResolveEventArgs va nous permettre de connaître l’assembly qui manque, sous la forme

YYYYY, Version=4.3.5.0, Culture=neutral, PublicKeyToken=9c321ad7c5c14ce7

Ce n’est pas forcément ce qu’il y a de plus joli, mais en réalisant un split sur cette propriété, on va pouvoir retrouver notre DLL :

string[] split = args.Name.Split(new string[1] { "," }, StringSplitOptions.RemoveEmptyEntries);
string assembly = string.Concat(split[0], ".dll");

Il suffira ensuite de lui accoler le répertoire dans lequel elle se trouve et de la charger à la volée :

Assembly missingAssembly = null;
string path = Path.Combine(directory, assembly);
if (File.Exists(path))
{
    missingAssembly = Assembly.LoadFrom(path);
}
return missingAssembly;

Voilà, rien de trop compliqué, donc, mais c’est quand même utile à savoir !

Catégories :.Net, C#, Développement
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :