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 !

MOTEUR DE PLUGINS AVEC CHARGEMENT/DÉCHARGEMENT


Information sur la source

Catégorie :.NET Source .NET ( DotNet ) Classé sous : plugin, sécurité, chargement, dynamique, module Niveau : Initié Date de création : 03/01/2008 Date de mise à jour : 12/02/2008 09:25:15 Vu / téléchargé: 4 393 / 208

Note :
Aucune note

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


Description

C'est un petit moteur de gestion de plugins qui permet de :
  - Charger/décharger à chaud les plugins
  - Rechercher les plugins dans les assembly
  - Gérer un niveau de sécurité réduit pour les plugins
  - Catégoriser les plugins (via des attributs)
  - Redémarrage d'un plugin en cas de plantage de celui-ci

Pour définir une classe comme étant un plugin, il faut qu'elle hérite de ClsPluginBase (ou ClsThreadPluginBase si c'est un nouveau Thread), et qu'elle soit tagguée avec un attribut dérivant de PluginAttribute (ou PluginAttribute si vous n'avez pas de catégories).
Ensuite, vous devez instancier un ClsPluginHostGeneric en spécifiant quel type de PluginAttribute (de catégorie) il doit gérer.
Vous pouvez énumérer les plugins disponibles dans un assembly via la fonction GetPlugins(string assembly).
Après, vous lancez un plugin avec LoadAndInitPlugin() en spécifiant quel plugin instancier, et vous obtenez l'instance du plugin. Libre à vous d'en faire ce que vous voulez (Start, Stop...).

Pour décharger un plugin, vous devez appeller UnloadPlugin() avec l'instance du plugin à décharger.

Un plugin qui crée une exception non gérée déclenche l'évènement PluginException. Si l'exception n'est pas gérée (PluginExceptionEventArgs.Handled=true) alors le plugin est redémarré, en sauvegardant son état (via les fonction SaveState et LoadState).

Coté sécurité :
Par défaut, un plugin tourne dans un bac à sable avec aucun droit (juste celui de s'exécuter). Pour modifier, vous devez vous abonner à l'évènement GetPluginPermissions du Host, et renseigner la propriété PluginPermissionEventArgs.Permissions avec les permissions que vous donnez à votre plugin.
 

Source

  • using System;
  • using System.Collections.Generic;
  • using System.Text;
  • using System.Threading;
  • using System.IO;
  • namespace MaitreDede.Plugins
  • {
  • /// <summary>
  • /// Sample plugin : write the current time on the Console each second
  • /// Plugin d'exemple : affiche l'heure actuelle sur la Console chaque seconde
  • /// </summary>
  • [Plugin("Sample plugin", "1.0.0.0")]
  • public sealed class ClsPluginSample:ClsThreadPluginBase
  • {
  • /// <summary>
  • /// Main loop
  • /// </summary>
  • protected override void Run()
  • {
  • while(this.Running)
  • {
  • Console.WriteLine(DateTime.Now.ToLongTimeString());
  • Thread.Sleep(1000);
  • }
  • }
  • /// <summary>
  • /// Save the plugin state (for restarting)
  • /// </summary>
  • /// <param name="saveStream">Stream where to save data</param>
  • public override void SaveState(Stream saveStream)
  • {
  • //Nothing to save
  • }
  • /// <summary>
  • /// Load the plugin state (for restarting)
  • /// </summary>
  • /// <param name="saveStream">Stream where to load data</param>
  • public override void LoadState(Stream saveStream)
  • {
  • //Nothing to load
  • }
  • }
  • }
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.IO;

namespace MaitreDede.Plugins
{
    /// <summary>
    /// Sample plugin : write the current time on the Console each second
    /// Plugin d'exemple : affiche l'heure actuelle sur la Console chaque seconde
    /// </summary>
    [Plugin("Sample plugin", "1.0.0.0")]
    public sealed class ClsPluginSample:ClsThreadPluginBase
    {
        /// <summary>
        /// Main loop
        /// </summary>
        protected override void Run()
        {
            while(this.Running)
            {
                Console.WriteLine(DateTime.Now.ToLongTimeString());
                Thread.Sleep(1000);
            }
        }

        /// <summary>
        /// Save the plugin state (for restarting)
        /// </summary>
        /// <param name="saveStream">Stream where to save data</param>
        public override void SaveState(Stream saveStream)
        {
            //Nothing to save
        }

        /// <summary>
        /// Load the plugin state (for restarting)
        /// </summary>
        /// <param name="saveStream">Stream where to load data</param>
        public override void LoadState(Stream saveStream)
        {
            //Nothing to load
        }
    }
}

Conclusion

Bon, j'ai refais la roue... Mais j'avais un peu de temps à tuer...

A vous de voir si cette librairie répond à vos besoins ;o)
 

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

03 janvier 2008 13:56:24 :
Modification du zip : projet vs2005
12 février 2008 09:25:15 :
Quelques bugs en moins, passage en projet VS2008.

Commentaires et avis

signaler à un administrateur
Commentaire de tmcuh le 03/01/2008 13:27:20

Hello il manque le fichier projet pour pouvoir tester. L'idée parait simpa, surtout le fait de "catégoriser" ton plugin.

signaler à un administrateur
Commentaire de maitredede le 03/01/2008 13:52:12

Salut :)
Le fichier projet est inclus (.csproj) c'est juste que je n'ai pas mis de fichier solution (.sln) et c'est du VS2008...
Je vais voir  pour faire un projet/solution VS2005

signaler à un administrateur
Commentaire de Aurazed le 14/01/2008 11:22:02

Bon projet, en revanche il manque un projet pour pouvoir tester, il n'y a que le projet MaitreDede.Plugins

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Chargement dynamique de type [ par thiosyiasar ] Bonjour a tous, Je voudrais faire un chargement dynamique d'assembly à partir d'un nom complet de type Par exemple, j'ai la valeur suivante "Syste XML, Enum, Dynamique [ par ricklekebekoi ] Bonjour,Je travail sur un serveur de jeu, dont l'émulateur est écrit entierement en c#. L'emulateur contient une base en assembly.exe, et un dossier s Chargement d'une assembly [ par onionichan ] Bonjour à tous,J'ai un petit souci technique avec un composant COM C# qui est utilisé dans Excel;1. J'ai enregistré mon assembly COM qui se trouve dan chargement d'un PDF qque soit la version d'acrobat [ par j_lamia ] Bonjourj'ai fait une application dans la quelle j'affiche un fichier pdf dans une form, pour cela j'ai utilisé pdf.ocx, installé avec ma version 6 d'a Tableau Dynamique [ par hedi_tounsi ] Coment on peu afficher un tableau dynamique c a d que le nombre de lignes et le nombre de colones change en fonction des paramétres? et es ce qu'on pe Sécurité tabControl [ par steph701 ] Salut à tous!J'utilise un tabControl avec 4 onglets. J'aimerais bloquer l'accès au tabPage de deux des onglets à l'aide d'un systeme de boite de dialo


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

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,421 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é.