begin process at 2010 02 10 12:43:17
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Applications

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :6 019 / 223

Auteur : Zeroc00l

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
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

Les Membres Club peuvent 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 :'(

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) RECHERCHE ET GESTION DE FICHIERS PERSONNALISÉES par JeremyLecouvert
Source avec une capture DEFORMÉE D'UNE POUTRE par keiz
Source avec Zip Source avec une capture OUTLOOK RESILIENCY CLEANER par Safti
Source avec Zip Source avec une capture Source .NET (Dotnet) COLORCOMBOBOX, COMBO BOX PERMETTANT DE SÉLECTIONNER DES COUL... par manshivas
Source avec Zip Source avec une capture Source .NET (Dotnet) YREGEXTER - THE REGEX TESTER par pysco68

 Sources en rapport avec celle ci

Source .NET (Dotnet) WEBTESTPLUGIN - IGNORER DES URLS LORS D'UN TEST WEB VISUAL S... par jesusonline
Source avec Zip Source .NET (Dotnet) MOTEUR DE PLUGINS AVEC CHARGEMENT/DÉCHARGEMENT par maitredede
Source avec Zip Source .NET (Dotnet) [.NET2] HÉBERGEUR DE PLUGINS AVEC CHARGEMENT ET DÉCHARGEMENT... par BaFM
Source avec Zip Source avec une capture Source .NET (Dotnet) PLUGIN PROGRAMME EXTENSIBLE GRÂCE AUX MODULES par badrbadr
Source avec Zip Source avec une capture Source .NET (Dotnet) UNE PAIRE D'YEUX QUI SUIT LE CURSEUR DU REGARD par Nikoui

Commentaires et avis

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 :)

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

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales