Moteur de plugins avec chargement/déchargement

Soyez le premier à donner votre avis sur cette source.

Vue 8 931 fois - Téléchargée 461 fois

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 / Exemple :


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)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
36
Date d'inscription
jeudi 16 février 2006
Statut
Membre
Dernière intervention
26 mai 2008

Bon projet, en revanche il manque un projet pour pouvoir tester, il n'y a que le projet MaitreDede.Plugins
Messages postés
153
Date d'inscription
vendredi 9 août 2002
Statut
Membre
Dernière intervention
18 septembre 2009

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
Messages postés
458
Date d'inscription
dimanche 22 décembre 2002
Statut
Membre
Dernière intervention
18 avril 2009

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.