2010-10-12 17 views
1

J'ai vu en ligne comment C# vous permet de compiler du code à la volée et je pense que c'est vraiment génial. J'ai besoin d'utiliser cette fonctionnalité pour mon projet. Mais voici le problème. Je n'essaie pas de compiler une fonction entière ou un nouveau programme dynamiquement. J'ai juste besoin d'appeler une seule déclaration pour créer ou supprimer des choses à la volée.Puis-je exécuter une seule instruction C# en tant que script?

Existe-t-il un moyen pour C# de compiler et/ou d'exécuter une instruction de code unique et de permettre à cette instruction d'agir sur des variables et des objets dans la portée du programme en cours?

Merci

+0

Il ressemble à ce que vous cherchez est la fenêtre immédiate: http://msdn.microsoft.com/en-us/library/f177hahy(v=VS.90) .aspx Cependant, je ne l'ai jamais utilisé pour * nouvelle * fonctionnalité pendant que le programme est en cours d'exécution. –

+0

Cela peut être utile: http://www.mono-project.com/CsharpRepl – Foole

Répondre

2

Vous pouvez compiler C# en utilisant Microsoft.CSharp.CSharpCodeProvider, mais cela devient vraiment compliqué si vous voulez le faire correctement, puisque vous devez charger votre code dans une application séparée de domaine pour éviter les fuites de mémoire.

Je suggère d'utiliser IronPython ou une autre langue de DLR: http://www.codeplex.com/wikipage?ProjectName=IronPython

Certains échantillons ici, pas sûr de la mise à jour est, mais la jolie de idée de la même: http://www.voidspace.org.uk/ironpython/dlr_hosting.shtml

0

« I juste besoin d'appeler une seule déclaration pour créer ou supprimer des choses à la volée. " Des déclarations comme celles-ci me font frémir jusqu'à mes os. Qu'est-ce que vous essayez d'accomplir ici, vraiment? Vous voulez que votre utilisateur écrive des instructions C# et que votre programme les exécute dans son AppDomain? Non seulement c'est un risque de sécurité immense, mais c'est aussi une expérience utilisateur terrible.

En outre, C# n'est pas un langage de script. Si vous essayez d'en faire un, vous allez avoir un mauvais moment.

+1

James: Cela dépend de qui est l'utilisateur.VS n'a aucun problème à exécuter du code C# écrit par l'utilisateur dans une fenêtre de surveillance de débogage ou dans une fenêtre immédiate. On peut supposer que le PO écrit une application où le code est saisi par l'utilisateur, plutôt que téléchargé sur Internet. – Gabe

+0

Je pense que même si c'était le cas, il y a encore des utilisations très légitimes, et C# avec CAS est tout aussi sûr que, disons, le JavaScript dans un navigateur. Néanmoins, oui, à moins qu'il ne veuille vraiment C#, j'utiliserais plutôt un langage DLR. http://en.wikipedia.org/wiki/Code_Access_Security –

+0

@Rei: les bons points. Je suis d'accord, une solution DLR ou un autre langage construit pour la scriptabilité devrait être utilisé à la place. –

0

Vous pouvez, tout en utilisant le débogueur. À un point d'arrêt, tapez simplement du code dans la fenêtre immédiate dans VS, et alto.

Une des meilleures fonctionnalités de débogage!

0

Le langage statique de script est compromis. Il y a des problèmes de portée et de sécurité à prendre en compte, mais ils peuvent être contrôlés.

Si vous cherchez à exécuter du code statique (c'est-à-dire C#) à partir d'une durée d'exécution gérée, je vous recommande de commencer par Mono. L'équipe Mono a fait des progrès en créant un environnement sûr pour compiler le code JIT en code natif lors de l'exécution.

Start with their official post on the subject.

0

Cela dépend de ce que vous essayez de faire ... si vous êtes à la recherche de l'utiliser comme un langage de script intégré dans une autre application, ma réponse ne s'applique pas, mais si vous voulez juste pour exécuter des instructions C# aléatoires (ou des programmes si vous le souhaitez) et les enregistrer en tant que scripts, LinqPad est génial pour cela.