2009-09-03 3 views
0

J'écris un petit outil de visualisation dans wpf, l'idée est que les utilisateurs moyens peuvent créer des visualisations intéressantes sans programmer d'assistants.dynamic keyword, C# compilation service - comment faire pour exécuter du code qui n'est pas encore disponible au moment de la compilation?

J'ai une classe de contrôleur qui a des méthodes comme StartPath (double x, double y) et LineTo (x, y) CurveTo (...), etc.

L'idée est qu'un utilisateur peut saisir ces commandes dans une zone de texte et le faire dessiner le résultat sur un canevas.

StartPath(0,0); 
LineTo(30,50); 
LineTo(50,40); 
EndPath(); 

Une idée que j'avais était d'utiliser un modèle de .cs qui a toutes les méthodes mises en œuvre, et dispose d'une commande supplémentaire Run() avec un jeton de remplacement à l'intérieur. Je charge le modèle sous forme de chaîne, insère les commandes utilisateur dans la méthode Run(), utilise le nouveau service de compilation .net 4.0 pour créer un assembly à la volée, le charge et invoque sa méthode Run() et accède au chemin exposé pour dessiner sur une toile.

Un autre serait effectivement juste d'analyser la zone de texte, l'erreur vérifier et appeler les méthodes appropriées.

Existe-t-il d'autres méthodes, en particulier avec le nouveau mot-clé dynamique?

Répondre

2

Vous n'avez pas besoin d'utiliser quoi que ce soit de nouveau à partir de .NET 4.0. La possibilité de compiler du code C# dans le framework est présente depuis longtemps. En fait, mon outil Snippy fait à peu près exactement ce que vous dites - c'est un modèle que le code d'utilisateur entre en jeu. Vous pouvez baser votre outil sur le mien, si vous le souhaitez. Vous pouvez télécharger le code depuis le C# in Depth site. En dehors de toute autre chose, vous n'aurez pas besoin de vos utilisateurs pour avoir .NET 4.0.

Comme pour dynamic - cela n'aide pas vraiment dans ce cas, à moins que vous ne vouliez laisser vos utilisateurs écrire du code dans IronPython/IronRuby. C# n'a toujours pas une sorte d'appel "eval" vous permettant d'exécuter une chaîne arbitraire.

+0

Je vais y jeter un coup d'oeil, merci beaucoup. Merci de m'avoir éclairci, je ne suis pas au courant des dernières spécifications C#. – kitsune

+0

Fonctionne très bien: http://dl.getdropbox.com/u/133877/test.jpg Merci encore :) – kitsune

1

Je pense que vous êtes mieux d'essayer de définir un langage LL1 et de générer un analyseur et un scanner et de construire votre propre interprète. Coco/R est un outil très stable et bien connu pour ce genre de travail. Check this out est ne devrait pas être difficile pour ce que vous avez à l'esprit:

http://www.scifac.ru.ac.za/coco/cshcoco.htm

Si vous souhaitez utiliser la nouvelle dynamique, vous aurez toujours problème pour analyser le texte de commande d'entrée. Vous pouvez utiliser dynamic pour construire votre interpréteur au-dessus de l'analyseur.

J'espère que cela aidera

+0

Pourquoi serait-il préférable d'aller à tous les soucis de concevoir et de mettre en œuvre votre propre langue que les utilisateurs seraient alors faut-il apprendre, plutôt que d'en utiliser un qui soit déjà bien conçu, robuste et bien connu? Si C# n'est pas un bon choix, il est assez facile d'utiliser Boo, IronPython, IronRuby etc ... –

+0

si vous voulez avoir votre propre mini jeu d'instructions comme goto (x, y) lineTo (x, y) vous pouvez n'utilise pas une langue déjà existante.L'utilisation a seulement pour apprendre votre mini-langue spécifique à l'entreprise pour pouvoir émettre des commandes. Si vous suivez le lien Coco/R, vous pouvez voir qu'il est facile de définir la grammaire LL1. Lorsqu'une entrée est analysée (au moment de l'exécution), l'analyseur généré appelle automatiquement un morceau de code .Net en vous transmettant toute information supplémentaire dont vous pourriez avoir besoin. Dites-moi si vous avez besoin d'aide pour mettre quelque chose en place. –

Questions connexes