Accueil > > > PLUGIN PROGRAMME EXTENSIBLE GRÂCE AUX MODULES
PLUGIN PROGRAMME EXTENSIBLE GRÂCE AUX MODULES
Information sur la source
Description
Bonjour, Ce programme vous permet de charger des modules d'une manière dynamique. Ces modules doivent impérativement implémenter l’interface IFormAddOn ou IMenuAddOn afin d’être charger correctement (voir CommonTypes pour plus de détails). Trois modules sont fournis pour les tests : · AboutMenuItem · FontToolBar · LeftToolBar Avan t le chargement d’un module, le programme récupère les informations sur celui-ci. Les informations sont stockées dans chaque assembly (.dll) sous forme d’attribut personalisé (voir ModuleInfoAttribute dans CommonTypes pour plus de détails). Le but de ce programme est de montrer comment on peut réaliser des applications qui peuvent "grandir".
Source
using System;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
using CommonTypes;
namespace PlugIn
{
class AssemblyLoader
{
#region Variables
//message d'erreur
private string errorMessage = null;
//référence vers la fenêtre principale
private Form form = null;
//référence vers le menu de la fenêtre principale
private MenuStrip menuStrip = null;
//assembly qui va être charger plus tard
private Assembly asm = null;
//information sur l'assembly
private ModuleInfoAttribute moduleInfo = null;
#endregion
#region Constructeur
public AssemblyLoader(Form form, MenuStrip menuStrip)
{
this.form = form;
this.menuStrip = menuStrip;
}
#endregion
#region Load
public bool Load(string filepath)
{
//on vérifie que l'assembly à charger existe
if (!File.Exists(filepath))
{
errorMessage = "Le fichier n'existe pas.";
return false;
}
//on charge l'assemby en prenant soin de s'assurer qu'elle est valide avec un try catch
try
{
asm = Assembly.LoadFrom(filepath);
}
catch
{
errorMessage = "Le fichier assembly est corrompu. Le fichier doit être une dll .net afin d'être chargé correctement.";
return false;
}
//on récupère tous les types contenus dans l'assembly
//type = class, enum, interface, delegate et struct
Type[] types = asm.GetTypes();
//on extrait l'info de l'assembly en récupérant l'attribut ModuleInfo
ExtractInfo();
//on demande à l'utilisateur s'il veut charger le module
if (moduleInfo == null)
{
if (MessageBox.Show("On ne dispose d'aucune information sur ce module. Voulez-vous continuer le chargement ?", "Aucune Information", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.No)
return false;
}
else
{
ModuleInfoForm moduleInfoForm = new ModuleInfoForm();
moduleInfoForm.setInfo(moduleInfo);
if (moduleInfoForm.ShowDialog() == DialogResult.No) return false;
}
//ce booléan nous informe si oui ou non on a trouvé au moins une classe qui implèmente
//l'interface IFormAddOn ou IMenuAddOn
bool foundInterface = false;
for (int i = 0; i < types.Length; i++)
{
Type IFormAddOnType = types[i].GetInterface("IFormAddOn");
Type IMenuAddOnType = types[i].GetInterface("IMenuAddOn");
//si notre type (une classe ici) implémente l'une de ces deux interfaces alosr...
if (IFormAddOnType != null)
{
//1 - instancier la classe
object o = asm.CreateInstance(types[i].FullName);
IFormAddOn formAddOn = o as IFormAddOn;
//2 - invoker la méthode d'installation
formAddOn.Install(form);
foundInterface = true;
}
if (IMenuAddOnType != null)
{
//1 - instancier la classe
object o = asm.CreateInstance(types[i].FullName);
IMenuAddOn menuAddOn = o as IMenuAddOn;
//2 - invoker la méthode d'installation
menuAddOn.Install(menuStrip);
foundInterface = true;
}
}
if (foundInterface)
{
return true;
}
else
{
errorMessage = "L'assemby spécifié ne contient aucun module.";
return false;
}
}
#endregion
#region ExtractInfo
private void ExtractInfo()
{
object[] moduleInfoArray = asm.GetCustomAttributes(typeof(ModuleInfoAttribute), false);
if (moduleInfoArray.Length != 0) moduleInfo = (ModuleInfoAttribute)moduleInfoArray[0];
}
#endregion
#region GetErrorMessage
public string GetErrorMessage() { return errorMessage; }
#endregion
}
}
Conclusion
Ma source : Pro C# 2005 and the .net 2.0 platform (Chapitre 12)
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Assembly.GetInterfaces() [ par jusob ]
Bonjour, J'ai un programme qui doit charger des DLLs. Ces DLLs implémentent l'interface PluginInterface. Programme principal: foreach (Typ
Assembly: custom attributes [ par jusob ]
Bonjour, j'utilise des custom attributes du genre: [assembly:AssemblyTitle("First plugin")] [assembly:AssemblyCompany("MySelf")] [assembly:Assemb
Commentaires avec reflection [ par chriskang ]
Bonjour, j'utilise les méthodes de System.Reflection pour récupérer les données de certaines classes contenues dans un assembly. En particulier, j'uti
Autre question sur la Reflection [ par mcferson ]
Bonjour ici. depuis ce code :[code=cs]public void GetDriver(string model) { if (model.Contains("AVL VT-SERIAL"))
ereur de (Microsoft.DirectX.AudioVideoPlayback) [ par zimamouche1 ]
j'essaie de devloper un lecteur MP3 par c# j'ajoute la réference Microsoft.DirectX.AudioVideoPlayback mais il existe un probléme: __________________
Plugin .Net WPF [ par xmox667 ]
Salut à tous, J'essaye de rendre modulaire une application WPF. Dans un assembly externe j'ai une classe et un datatemplate. Dans l'application hôt
Problème de FileLoadException en chargeant un assembly [ par Hermios ]
Salut à tous, Je développe sous Visual C# 2010 express, et mon projet consiste entre autre à créer un exécutable pour charger un fichier dll, via Asse
Problème pour charger une assembly externe, sans copie locale [ par Hermios ]
Salut à tous, J'ai crée une dll avec une config, et souhaiterait l'importer dans un nouveau projet. J'ai donc ajouté une référence à cette dll dans mo
Probleme assembly [ par Aposia ]
J'ai une assembly qui fonctionne tres bien en local sur une application. L'importation se fait sans probleme. Cependant, je veux maintenant utiliser c
Creation d'un plugin IE [ par LAlex ]
Salut TLM !Je suis en train d'effectuer le portage d'une application Client/Serveur en n-Tiers pour le Web. L'application existante génère un document
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|