1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| private void ChercheEtInstancieCartes()
{
// PHASE 1 : TROUVER TOUTES LES DLL
// --------------------------------
List<string> files = new List<string>(); // créer une liste des dll trouvées
// COMPILATION CONDITIONNELLE EN MODE DEBUG
#if DEBUG
// récupérer le répertoire de la solution
var dirSolution = Directory.GetParent(Directory.GetParent(Directory.GetParent(Application.StartupPath).ToString()).ToString());
// chercher tous les sous-directories qui s'appellent "Debug"
var sousdirs = Directory.GetDirectories(dirSolution.ToString(), "Debug", SearchOption.AllDirectories);
foreach (string dir in sousdirs) // scanner tous les sous-directories trouvés
if (dir.Contains(@"bin\Debug")) // si c'est bien un répertoire Debug de bin (et non de object) : GetDirectories avec @"bin\Debug" plante
{
var dlls = Directory.GetFiles(dir, "*.dll", SearchOption.TopDirectoryOnly); // récupérer toutes les dll de ce répertoire
if (dlls != null) // si on a trouvé des dll
foreach (var dll in dlls) // pour chacune des dll
if (!dll.Contains("PublicReferences")) // sauf pour PublicReferences.dll (non instanciable)
files.Add(dll); // ajouter la dll à la liste des fichiers trouvés
}
// COMPILATION CONDITIONNELLE EN MODE RELEASE
#else
var dirPlugins = Application.StartupPath + @"\Plugins"; // localiser répertoire des Plugins = sous-répertoire Plugins de l'application
files = Directory.GetFiles(dirPlugins, "*.dll", SearchOption.TopDirectoryOnly).ToList<string>(); // chercher toutes les dll de ce répertoire
#endif
// PHASE 2 : TROUVER LES TYPES UTILES DANS LES DLL
// -----------------------------------------------
//----------------------------------------------------------------------------------------
// Dans chaque dll on va trouver tous les types référencés (classes, enums etc).
// Il faut extraire les classes dérivées des vues abstraites gérées par Domogest (une seule
// classe par projet). Ensuite on instancie la classe et on sauve l'instance dans la liste
// concernée. On doit instancier car une classe statique ne permettrait pas l'accès aux
// méthodes de la classe parent, la syntaxe :(
// classederivee as classeparent).methodeclasseparent ne fonctionne pas pour les classes
// statiques. La classe instanciée devient la classe de communication entre le projet
// Domogest et la classe fille
//----------------------------------------------------------------------------------------
foreach (var dll in files) // pour chaque dll trouvée
try // nécessaire car exception si dll n'est pas une assembly dotnet
{
Assembly assembly = Assembly.LoadFrom(dll); // charger la dll en tant qu'assembly (exception si impossible)
foreach (var type in assembly.GetTypes()) // pour chaque type contenu dans la dll (enums, classes etc)
{
if (type.BaseType == typeof(VueInterface)) // si on trouve une classe dérivée de VueInterface
{
interfaces.Add // l'instancier en tant que VueInterface et l'ajouter à la liste des interfaces
(Activator.CreateInstance(type) as VueInterface);
break; // une seule classe utile par dll
}
}
}
catch { } // en principe ne devrait jamais survenir en release si on n'a pas mis
// n'importe quoi dans le répertoire Plugins
} |
Partager