2009-08-12 13 views
2

Je crée un robot IRC en C#, et je voudrais avoir la fonctionnalité pour charger des plugins ... par exemple: il y aurait un fichier texte avec du code, puis le programme importerait le contenu de ce fichier texte AS CODE ... dans une fonction ... comment est-ce possible?Plugins/modules pour mon programme C#

Répondre

0

Vous aimeriez peut-être regarder dans la classe CSharpCodeProvider. Il y a un exemple de code dans this question. A part cela, il existe l'option de précompilation des DLL et d'utilisation de la liaison tardive pour charger ceux qui sont en cours d'exécution.

À part cela, vous pouvez intégrer un moteur de script tel que Lua dans votre programme. La réponse courte est, il y a toutes sortes d'options disponibles, cela dépend exactement de ce que vous essayez de réaliser quant à la meilleure solution. Dans les deux premiers exemples, vous étudieriez la programmation d'interface, vous auriez une interface définie dans une seconde DLL que vous pourrez compiler, puis extraire un nom prédéterminé de l'assemblage par réflexion, et assigner à une variable du type d'interface et faire des appels contre cela.

Je n'ai jamais utilisé Lua, mais l'article que j'ai lié aussi devrait expliquer comment l'utiliser.

0

Vous devez rechercher la compilation de code dynamique (voir http://www.west-wind.com/presentations/dynamicCode/DynamicCode.htm, http://www.codeguru.com/csharp/csharp/cs_misc/designtechniques/article.php/c10729/, http://www.codeproject.com/KB/cs/Dynamic_Code_Generation.aspx)

Vous ne pensez pas qu'il serait préférable de charger les plugins dans la réflexion comme DLL par lieu si? Le code dynamique ne serait pas signé, donc vous n'avez aucun moyen de vérifier que le code provient d'une source fiable et, en tant que tel, pourrait ouvrir les utilisateurs de votre programme à un code très malveillant.

+0

Cela dépend. Parfois, vous voulez une compilation dynamique, car le code que vous compilez est fourni par l'utilisateur (une sorte de système de script par exemple). –

+0

Ah, c'est un bon point là. Quand il disait "plugins" c'est ce que j'imaginais, pas forcément scripting. – Fooberichu

1

Je suggère soit en utilisant C#-script ou un langage DLR comme IronPython (je préfère le dernier). Mais, comme d'autres l'ont souligné, il est dangereux d'exécuter n'importe quel code reçu par votre programme - une idée plus sage serait de définir une interface de contrat et d'accepter les plugins (implémentant cette interface) dans des assemblages signés.

2

Je fais la même chose pour un MUD server. Ce serveur a à la fois des plugins compilés et des plugins de code comme vous voulez utiliser. J'ai créé mon propre moteur de script en utilisant CodeDom, mais c'était assez compliqué. J'ai fini par passer à CS-Script. Alors maintenant, nous utilisons MEF pour les plugins compilés et CS-Script pour les plugins de code.

+0

Pouvez-vous expliquer pourquoi cela a été un problème? J'ai roulé le mien en utilisant CodeDom (Ironiquement, pour un client MUD), et c'est assez simple, mais toujours facile à utiliser, étendre et autres. –

+0

Utiliser CodeDom pour les plugins simples est facile. Cependant, les choses deviennent beaucoup plus compliquées lorsque vous essayez de décharger et/ou de remplacer un plugin déjà chargé. Cela impliquait principalement le chargement des assemblées dans un domaine différent.Tout ce qui était au-delà de ça était un problème pour moi. Je voulais construire un MUD pas tout un framework de plugin, d'où mon commentaire. –

0

merci d'aider, mais je cherche à partager du code entre le code importé et le code principal, par exemple, il y aurait un fichier texte, et au chargement du programme principal, il ouvrirait ce fichier texte et chargerait il en fonction ... une fonction qui pourrait partager du code comme des chaînes publiques et ints et activer d'autres fonctions a des commandes et utiliser des objets etc etc ... est-ce possible?