La meilleure façon de mettre en place un programme modulaire en C#
Mon ami et moi sommes de l'écriture d'un IRC C# bot, et nous sommes à la recherche d'un moyen d'inclure un module de système, de sorte que les utilisateurs peuvent écrire des modules personnalisés pour étendre la fonction.
Le bot utilise des Regex pour diviser toutes les données brutes à partir du serveur, puis déclenche l'événement avec les données. Pour exemple, un gestionnaire d'événement qui pourrait ressembler à:
OnChannelMessage(object sender, ChannelMessageEventArgs e)
{
}
Dans ChannelMessageEventArgs
serait le nom du canal, le pseudo de l'expéditeur de message, etc...
J'aimerais avoir un système de plugin pour que les gens puissent construire des modules et de charger /décharger à volonté, quand le bot charges, ou pendant son exécution.
Idéalement, je voudrais être en mesure de compiler les .cs
des fichiers à la volée, et dans le plugin.cs fichier, serait peu de choses:
- ce cas de capture, par exemple, OnChannelMessage, et la Channeldata dans OnChannelEventArgs
- que faire lorsque cette information est donnée,
- un texte d'aide dans (que je peux appeler à partir de l'intérieur de la principale bot.. donc dire une chaîne de caractères, help = "ceci est l'aide de ce plugin" qui peut être renvoyé à tout moment et sans appel du plugin)
- ce que le nom du plugin est etc
Merci pour toutes les idées sur où commencer pour quelqu'un qui est relativement nouveau à la programmation.
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé des trucs de ce genre sur des projets d'avant, mais il a été un moment. Il y a probablement des cadres qui font ce genre de choses pour vous.
Écrire votre propre architecture de plug-in, fondamentalement, vous voulez définir une interface pour tous les modules à mettre en œuvre, et de mettre cela dans une assemblée partagé par le programme et les modules:
Alors votre les développeurs de coder leurs modules à cette assemblée, de préférence avec un constructeur par défaut.
Dans votre programme (en supposant que vos modules seront intégrés dans leurs propres assemblées) vous chargez une référence à un assembly contenant un module de trouver les types qui implémentent l'interface du module, et les instancier:
Si vous voulez compiler le code à la volée: vous créez un compilateur objet, de lui dire ce que les assemblys de référence (Système et celui qui contient IModule, ainsi que tous les autres références nécessaires), de lui dire de compiler le fichier source dans un assemblage. À partir de là, vous obtenez les types exportés, filtre à ceux qui mettent en œuvre les IModule, et de les instancier.
Chercher des tutoriels sur le plug-in architectures et chargement dynamique assmeblies pour obtenir une meilleure idée pour faire ce genre de choses. C'est juste le début. Une fois que vous avez les bases vers le bas, vous pouvez commencer à faire des choses vraiment cool.
Comme pour la manipulation des métadonnées (module de X est nommé YYY et doit gérer les événements A,B et C):
Essayez de travailler dans votre système de type. Vous risquez de faire des interfaces différentes pour les différentes fonctions/événements, ou vous pourriez mettre toutes les fonctions sur une seule interface, et de mettre les attributs (vous devez les déclarer dans le partage de l'assemblée) sur le module de classes, en utilisant les attributs de déclarer les événements de ce module doivent souscrire. Fondamentalement, vous voulez le rendre aussi simple que possible pour les gens à écrire des modules de votre système.
ou
amusez-vous!
La Managed Extensibility Framework (MEF) offre exactement ce que vous recherchez, à moins qu'ils appellent une architecture de Plugin. Vous pouvez fournir une interface commune qui vous utilisateurs pourraient s'appuyer sur puis MEF pourrait scanner un répertoire pour les dll et de charger toutes les Exportations de façon dynamique.
Par exemple votre plugin auteurs ont pu créer quelque chose comme
Puis votre code pourrait ressembler à quelque chose comme ceci:
FileSystemWatcher
,Assembly.Load
, et un peu de réflexion, vous devriez être en mesure de modéliser quelque chose de similaire assez facilement.Veuillez jeter un oeil un de microsoft Managed Extensibility Framework (MEF) - Il propose de faire partie de ce que vous voulez, et fournit un grand nombre de autre caractéristiques:
Les résultats de Google pour les "managed extensibility framework'
Il y a une autre option dans le foyer de .NET 3.5 appelé Géré AddIn Cadre (CRG). Consultez les liens suivants sortir.
De l'échantillon et des Outils: http://clraddins.codeplex.com/
CRG Blog: http://blogs.msdn.com/clraddins/
Un bon article: http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/08/13/Build-AddIns-with-System-AddIn.aspx
MEF - Managed Extensibility Framework est à la mode en ce moment - je pense que ce serait le meilleur ajustement.
Si ce n'est pas pour faire le tour, vous pourriez aussi regarder sur Prism, ils ont une autre approche pour mettre en place des modules.