2009-09-27 6 views
1

Je suis un peu nouveau pour C# .Net et je jouis le processus d'apprentissage! En ce moment je travaille sur un projet (juste pour apprendre) dans lequel les plug-ins sont la clé principale.Aidez-moi s'il vous plaît avec l'écriture d'un plug-in en C# qui exporte est sur laisser dire Config GUI

j'ai fait ce qui suit jusqu'à présent qui semble fonctionner très bien:

Interface:

namespace My.test 
{ 
    public interface IMyPlugin 
    { 
     bool Execute(string Id, Object param); 
     List<string> GetPluginIdList(); 
    } 
} 

un plug-in test de mise en œuvre IMyPlugin Interface:

using System; 
.. 
.. 
using My.test; 

namespace demoplg 
{ 
    public class SamplePlugIn: IMyPlugin 
    { 

     public bool Execute(string Id, object param) 
     { 
      MessageBox.Show(Id, "SamplePlugIn"); 
      return false; 
     } 

     public List<string> GetPluginIdList() 
     { 
      List<string> result = new List<string>(); 
      result.Add("test1"); 
      result.Add("test2"); 
      return result; 
     } 
    } 
} 

et dans l'application principale (Host) J'utilise Réflexions pour charger la DLL (assemblage) et créer une instance de plug-in.

try 
      { 
       Type[] types = PlugIn.GetTypes(); 
       Type MyPlugInType = null; 
       foreach (Type libtype in types) 
       { 
        //check if it implements the IMyPlugin. 
        Type[] interfacelist = libtype.GetInterfaces(); 
        foreach (Type lookupInf in interfacelist) 
        { 
         if (lookupInf.Name.Equals("IMyPlugin")) 
         { 
          MyPlugInType = libtype; 
          break; 
         } 
        } 

        if (MyPlugInType == null) continue; 

        IMyPlugin xplg = null; 
        ConstructorInfo ci = MyPlugInType.GetConstructor(new Type[] { }); 
        xplg = ci.Invoke(null) as IMyPlugin; 
        return xplg; 
       } 
       return null; 
      } 
      catch 
      { 
       return null; 
      } 

bien, maintenant ce que je veux avoir est qu'un plug-in peut avoir est sur l'interface graphique de configuration, que je voudrais ajouter que dans mon hôte (application principale) en appelant quelque chose par exemple: xplg.RegisterPluginGUI(); Disons quelque chose sous la forme d'une arborescence sur le côté gauche montrant le nom/la description du plug-in, et sur le côté droit d'un conteneur où je peux déposer l'interface utilisateur du plug-in dessus.

peut quelqu'un s'il vous plaît donner quelques conseils comment atteindre cet objectif?

Eh bien, j'ai fait quelque chose de similaire dans Delphi qui n'est pas un travail très propre ;-) Utiliser l'API WIN pour traiter les messages d'un à partir d'un dll mis en cache dans le formulaire principal !!!

Merci d'avance! AK

+0

En passant, regardez dans le cadre de Mono.Addins. Ils ont un système facile pour enregistrer des plugins, cela vous évitera de chercher en utilisant la réflexion pour les implémentations de vos interfaces. Croyez-moi, ce que vous faites maintenant sera douloureux si vous commencez à créer plus d'interfaces de plugin. –

+0

Merci pour votre indice! – Gohlool

Répondre

0

Vous pouvez ajouter à votre interface IMyPlugin une méthode ou une propriété qui retourne le contrôle de configuration:

public interface IMyPlugin 
{ 
    UserControl GetConfigurationControl(); 
} 

public class SamplePlugIn: IMyPlugin 
{ 
    public UserControl GetConfigurationControl() 
    { 
     return new MyConfigurationControl(); 
    } 
} 

public class MyConfigurationControl : UserControl 
{ 
} 

Après cela, vous pouvez utiliser le contrôle de l'utilisateur sous une forme dans votre application.

Si vous préférez utiliser une forme, une autre option est:

public interface IMyPlugin 
{ 
    void ConfigurePlugin(); 
} 

public class SamplePlugIn: IMyPlugin 
{ 
    public void ConfigurePlugin() 
    { 
     using(YourPluginConfigurationForm dlg = new YourPluginConfigurationForm()) 
     { 
      dlg.ShowDialog(); 
     } 
    } 
} 
+0

Merci! L'idia de forme est simple et à mon humble avis le plus facile à mettre en œuvre. L'idie UserControl est intéressante et je dois essayer de voir si je peux encore utiliser par exemple la touche TAB pour passer d'un contrôle à l'autre entre le contrôle de l'hôte et les contrôles de plug-in. – Gohlool

1

Il est peut-être un peu hors-sujet, mais je vous recommande d'apprendre les bibliothèques suivantes pour le développement de plugins au lieu de créer votre propre:

Managed Extensibility Framework

System.AddIn Namespace

Si votre objectif est en train d'apprendre alors votre code peut être OK, mais je Dans des scénarios réels, vous devez utiliser des solutions éprouvées comme celles mentionnées ci-dessus.

Je veux aussi mentionner que MEF est un projet open-source et vous pouvez éventuellement trouver des réponses à de nombreuses questions concernant l'architecture des plug-ins.

+0

Merci pour les liens! Je vais les vérifier à coup sûr! – Gohlool

+0

+1 pour la mention MEF. L'utilisation de quelque chose de pré-construit est une bonne idée s'il y a une bonne correspondance car cela facilite la maintenance. –

Questions connexes