2009-06-25 7 views
9

Je dois faire une application graphique d'interface utilisateur en utilisant la langue de mon choix. L'application fonctionnera sous Windows XP. Ce sera une sorte d'application de formulaire Windows complexe. Je pense et comme pour la plupart des suggestions, C# sera le meilleur à utiliser. L'arborescence située à gauche de l'interface graphique s'affichera après la lecture d'un fichier de configuration qui sera un fichier binaire. (mais au départ je peux travailler avec un simple fichier ASCII pour tester mon code.). L'application accepte certaines entrées de l'utilisateur via cette interface graphique et écrit le retour dans le même fichier de configuration et reflète les changements dans l'arborescence ou les étiquettes ou tout autre champ correspondant sur le formulaire.Application plugin en C#

Il y aura 3 onglets et 3 fichiers de configuration correspondants pour chacun des onglets. J'ai besoin d'aide pour concevoir l'application pour le moment. Je prévois de faire une application hôte (application principale) et d'utiliser les 3 contrôles onglet comme plugins. Est-ce faisable? Si oui, pouvez-vous me guider s'il vous plaît? Je veux dire comment faire 3 plugins en C# et comment écrire les interfaces pour que l'application principale sache quel plugin charger et quand le charger? Y aura-t-il un dossier "Plugin" séparé sous mon dossier de projet? J'espère que vous avez compris mon point de vue, mais c'est trop peu d'informations pour commencer.

De plus, certains fichiers .cpp existent déjà dans le projet. Ces fichiers ainsi que certains fichiers .h contiennent des définitions et des constantes importantes. Ceux-ci doivent être intégrés à mon application C#. Je n'ai aucune idée de comment faire cela mais je suis sûr que c'est possible en compilant le code .cpp dans un fichier .dll, puis en exposant le .dll compilé à mon application C#. S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations pour la conception de haut niveau.

Merci, Viren

+0

"Je dois faire une application graphique d'interface utilisateur" Avoir le courage de dire "Non" – ima

+0

je n'ai pas eu vous? – zack

Répondre

12

Pour implémenter une interface de plugin manuellement, vous aurez besoin d'une méthode comme celle-ci. J'ai laissé quelques TODOs, où vous voudriez améliorer le traitement des erreurs et/ou rendre l'implémentation un peu plus spécifique à chaque cas.

public List<T> LoadPlugin<T>(string directory) 
    { 
     Type interfaceType = typeof(T); 
     List<T> implementations = new List<T>(); 

     //TODO: perform checks to ensure type is valid 

     foreach (var file in System.IO.Directory.GetFiles(directory)) 
     { 
      //TODO: add proper file handling here and limit files to check 
      //try/catch added in place of ensure files are not .dll 
      try 
      { 
       foreach (var type in System.Reflection.Assembly.LoadFile(file).GetTypes()) 
       { 
        if (interfaceType.IsAssignableFrom(type) && interfaceType != type) 
        { 
         //found class that implements interface 
         //TODO: perform additional checks to ensure any 
         //requirements not specified in interface 
         //ex: ensure type is a class, check for default constructor, etc 
         T instance = (T)Activator.CreateInstance(type); 
         implementations.Add(instance); 
        } 
       } 
      } 
      catch { } 
     } 

     return implementations; 
    } 

Exemple d'appel:

List<IPlugin> plugins = LoadPlugin<IPlugin>(path); 

Quant au C++ partie de votre question.Il y a peu de façons différentes d'aborder cela, bien que le choix correct dépend de votre situation spécifique. Vous pouvez créer un fichier .dll compatible clr en C++, que votre projet C# pourrait référencer et appeler comme n'importe quel autre fichier .dll. En outre, vous pouvez utiliser P/Invoke pour appeler un fichier .dll natif.

+0

merci beaucoup.Ceci m'a vraiment aidé .. – zack

+0

Toujours agréable de trouver un article que vous ne cherchiez pas et pense, je devrais mettre en œuvre un tel caractéristiques, excellent point de départ! – RobertPitt

8

un des plus faciles concepts plug-ins que j'ai jamais utilisé était certainement le Managed Extensibility Framework qui fera partie de .NET 4 (afaik). Malheureusement, il n'est pas encore terminé et seul un aperçu est disponible qui peut différer de la version finale. Cela étant dit, nous avons utilisé MEF Preview 3 pour un projet uni et cela a fonctionné sans problème et cela a certainement rendu l'ensemble du plugin beaucoup plus facile.

+0

Utilisez certainement MEF c'est génial. –

1

Regardez Castle.

+0

thanks..castle semble fantastique .. je n'étais pas au courant de cela .. – zack

3

Regardez l'espace de noms System.AddIn: http://msdn.microsoft.com/en-us/library/system.addin.aspx

Sinon, vous pouvez tout faire vous-même. Avant que cet espace de noms soit disponible, j'ai utilisé une interface commune "IPlugin" que chaque plugin/addin devait utiliser. J'ai ensuite eu un chargeur qui a inspecté tous les * .dll dans un dossier, puis utilisé la réflexion pour vérifier l'interface. Je pourrais alors créer des instances de classes qui ont implémenté mon interface plugin/addin

Les fichiers cpp auront probablement besoin d'être convertis en C#, ou vous pourriez éventuellement créer une DLL à référencer.

Questions connexes