Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

HOTPLUG MANAGER : GESTIONNAIRE DE PLUGINS INTERCHANGEABLES EN LIVE (OU "À CHAUD")


Information sur la source

Catégorie :Applications Source .NET ( DotNet ) Classé sous : hot, plugin, greffon, live, chaud Niveau : Initié Date de création : 22/11/2007 Date de mise à jour : 31/01/2008 21:29:45 Vu / téléchargé: 5 172 / 203

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note


Description

Gérer simplement des plugins sans redémarrer l'application. Galère !
Et ben plus maintenant !

Je souhaitais une application qui puisse recharger en live un plugin lorsqu'il est mis à jour.
Autrement dit :

-- Dans un dossier, disons ... "plugins", je met les plugins que je veux charger au démarrage.
-- Quand je décide d'updater un plugin, je met simplement la nouvelle dll dans un autre dossier, disons "updates". Et là c'est magique, le gestionnaire reconnait le plugin, vérifie que c'est une version plus récente que celle qui tourne, et change le plugin en live.
Le changement s'effectue en demandant au plugin de se mettre en pause puis de sauvegarder ses donnés.
La sauvegarde sera fournit à la nouvelle version au moment de son démarrage.


La petite histoire (ou "ma life" ... mais non partez pas !)

A l'origine je souhaitais faire un client irc en C#... avec un bot :-D
Pourquoi ? Simplement parce que :
--> j'en ai soupé de l'irc scripting...
--> J'avais envie de m'amuser à developper un bot "intelligent"
(les sources ça sera pour beaucoup plus tard :)
--> Et puis comme on peut compiler le C# en live on peut creer une dll en live ...
    Donc on peut remplacer l'irc scripting (ta tatataaaaaaaa ! \o/)
    (quoi ? déja dit... mais nan j'avais pas assez insisté c'est tout !)

Au début je m'étais jeté dans le code ... et j'étais obligé de redémarrer mon client pour que la nouvelle version de mon bot soit executée. Les déco et reco incessantes commençaient doucement à énerver les irciens sur les channels.
Donc je me suis dit et pourquoi pas faire un "truc" qui marche en live (non "truc" c'est pas ringard ... >:p)
En dehors de mes hobbies qui consiste à réinventer la roue, je me suis dit aussi que ça pourrait avoir des applications fort sympathiques (genre patchage de code à distance sur un serveur web ... sécurisé bien sûr :D )


Le bémol :

Le manager ne gère pas les droits d'écriture, éxécution, etc ...
Tout simplement parce que cette lib est destiné à un usage personnel.
Autrement dit y'aura pas de Kevin pour faire un plugin-virus :) ...


Passons au zip :

3 dossiers pour 3 modules :


PluginManagerTest :
  Application  de base gérant les plugins
  Une simple form est lancé ..
  L'application nécessite une référence au module PluginManagement


PluginManagement :
  Contient tout ce qui est nécessaire à la réalisation d'un plugin manager
    Interfaces.cs : Les interfaces nécessaires à la communication entre le plugin manager et les plugins (à rédéfinir par vous).
    Loader.cs     : Le loader qui s'occupe de charger les assemblies dans un domaine d'application différent.
    Manager.cs    : Le plugin manager, enfin ! C'est la classe qui gere les plugins et utilise Loader.cs
                    Cette classe est celle qui est utilisé par l'application.

MyPlugin:
  Définit un plugin de base.
  Ce module nécessite une référence au module PluginManagement
  (en réalité il à seulement besoin d'Interfaces.cs mais j'avais pas envie de faire un quatrième module)


  Principe: Dans le dossier plugins sont stockés les plugins chargés par l'application
            Quand on met une dll du même nom dans le dossier update,
            l'application le détecte et remplace le plugin en live.

  Cas de cette application :
            L'application charge "MyPlugin.dll" dans "plugins" quand on clic sur "Charger le plugin"
            A chaque fois que l'on clique sur "Recharger le plugin" l'application regarde si
            le fichier "MyPlugin.dll" existe dans le dossier "update".
            Si il existe alors il est déplacé dans "plugins" et remplace l'ancienne version.
            Les anciennes versions du plugin sont sauvés sous la forme MyPlugin.dll.backup<i>,
            ou "i" correspond à la vieillesse du plugin (1, 2, 3 ...)
 

Source

  • // Comme ça me gonfle de toujours voir écrit "dans le zip"
  • // Je vous montre un peu à quoi ça ressemble au final :
  • // (A savoir que c'est du copié/collé d'une partie de ce qu'il y a le zip !)
  • // Dans la classe de la form :
  • // Définit les dossiers dont j'ai parlé dans la description
  • Manager plugin_manager = new Manager("plugins", "update");
  • // Chargement d'un plugin au demarrage :
  • int my_plugin_id = plugin_manager.ImportPlugin(@"plugins\MyPlugin.dll");
  • if (-1 == my_plugin_id)
  • MessageBox.Show("Erreur : Plugin non valide ! (ne respecte pas l'interface en general)");
  • / Toute les 3 secondes le gestionnaire check les updates de tous les plugins
  • // Une valeur de 0 arrête la vérification.
  • plugin_manager.IntervalUpdate = 3000;
  • // Tester soit même l'update du plugin :
  • if (plugin_manager[my_plugin_id].CheckUpdate())
  • MessageBox.Show("patché !);
  • // "Mais t'es un ouf !"
  • // "Moi je suis flemmard mais j'ai quand meme des patchs ultra sensible."
  • // "Je veux que tous les plugins soit updaté automatiquement ...
  • // sauf un plugin en particulier que je veux uploader manuellement !"
  • // "Du calme petit scarabé !"
  • plugin_manager[my_precious_plugin_id].AutoUpdatable = false;
  • // Ce qui n'empêche pas de faire l'appel à CheckUpdate !
// Comme ça me gonfle de toujours voir écrit "dans le zip"
// Je vous montre un peu à quoi ça ressemble au final :
// (A savoir que c'est du copié/collé d'une partie de ce qu'il y a le zip !)


// Dans la classe  de la form :
// Définit les dossiers dont j'ai parlé dans la description
Manager plugin_manager = new Manager("plugins", "update");


// Chargement d'un plugin au demarrage : 
int my_plugin_id = plugin_manager.ImportPlugin(@"plugins\MyPlugin.dll");
if (-1 == my_plugin_id)
   MessageBox.Show("Erreur : Plugin non valide ! (ne respecte pas l'interface en general)");


/ Toute les 3 secondes le gestionnaire check les updates de tous les plugins
// Une valeur de 0 arrête la vérification.
plugin_manager.IntervalUpdate = 3000; 

// Tester soit même l'update du plugin :
if (plugin_manager[my_plugin_id].CheckUpdate())
   MessageBox.Show("patché !);

// "Mais t'es un ouf !"
// "Moi je suis flemmard mais j'ai quand meme des patchs ultra sensible."
// "Je veux que tous les plugins soit updaté automatiquement ...
//  sauf un plugin en particulier que je veux uploader manuellement !"
// "Du calme petit scarabé !"
plugin_manager[my_precious_plugin_id].AutoUpdatable = false;
// Ce qui n'empêche pas de faire l'appel à CheckUpdate !

Conclusion

Bon ben voila :)
Y'a pas mal de commentaires dans les sources (en anglais souvent).
Je suis ouvert à toutes critiques (constructives) !

Pour tester il existe trois versions de myplugin.dll (dans le dossier "bin/Debug/update").
Renommer les versions 2 et 3 (la 1 étant celle chargée au démarrage) en "MyPlugin.dll".
Les fichiers disparaissent à chaque fois (normal ! C'est le gestionnaire qui les déplacent).
Bonne chance !
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

23 novembre 2007 02:52:39 :
Correction du texte
31 janvier 2008 20:49:35 :
J'avais du boire... En fait la lib marchait bien et le plugin ne se déconnectait pas... Par contre j'avais oublié de surcharger la méthode InitLifeTimeService de la classe qui teste le passage d'information entre l'application principale et le plugin !
31 janvier 2008 21:28:31 :
La description et le code n'ont pas été changé Rhalala... CS n'est plus ce qu'il était :'(
31 janvier 2008 21:29:45 :
La description et le code n'ont pas été changé Rhalala... CS n'est plus ce qu'il était :'(

Commentaires et avis

signaler à un administrateur
Commentaire de Bidou le 23/11/2007 14:00:13 administrateur CS 9/10

Pas encore pu regardé en détail, mais semble être un bon code à priori :)

signaler à un administrateur
Commentaire de jesusonline le 24/11/2007 21:21:04 administrateur CS

Bonsoir, je pense que tu seras interessé par le nouveau namespace de .net 3.5 : System.AddIn. Tu peux avoir des infos sur cet assembly sur le blog de la team : http://blogs.msdn.com/clraddins/.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

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 Curseur - Point chaud [ par bucherb ] Est-ce que qqun sait comment définir dynamiquement le point chaud d'un curseur???-------------------------Trambert le vert (c#) Problème gestion d'évents de control ajoutés "en live" [ par alienatyon ] Bonjour à tous et à toutes.Je suis entrain de développer une application en c#, dans laquelle j'ajoute des contrôles (labels et boutons) "en live" (pl Problème d'unload de plugin [ par revlis ] Bonjour a tous, J'ai fait une petite application composée de modules (plugin)Chaque dll presente dans un sous-repertoire représente un "module". celui Curseur - Point Chaud [ par bucherb ] Hello! Est-ce que qqun saurait comment faire pour d&#233;finir le point chaud (hot spot) d'un curseur qu'on cr&#233;e soit-m&#234;me dans le code..... Assembly.GetInterfaces() [ par jusob ] Bonjour, J'ai un programme qui doit charger des DLLs. Ces DLLs impl&#233;mentent l'interface PluginInterface. Programme principal: foreach (Typ J'aimerai savoir si qqn a deja essye d'installer le plugin CORTONA [ par xakal ] je voudrais mettre se lecteur de VRML dans une de mes applications en dessous d'un datagrid.niveau 1 : fenetre principale avec des boutons pour appell Plugin IE dans visual studio? [ par bucherb ] Hello!Je cherche partout un genre de control IE pour mes windows forms, ou je lui passe du html par exemple, et lui se charge du rendu... Ca existe? J Plugin Messenger [ par jeuneprog ] Bonjour &#224; tous, Je cherche a faire un plugin pour messenger 7.5, il y a un tuto pour messenger 7.0 sur developpez.com&nbsp;mais qui ne fonctionne Reproduire texte d'un textbox en live [ par nicompx ] Comment faire pour reproduire ce que j'&#233;crit dans un textbox dans un autres textbox en directe


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,515 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.