2010-06-24 7 views
5

Je me souviens quand .NET 4 était en version bêta il y avait une vidéo d'un développeur qui a fait une application en ligne de commande dans laquelle il pouvait taper du code C# et il compilait le code à la volée. L'idée était que le compilateur était maintenant disponible dans le langage .NET.Compilation du code .NET dans .NET 4?

Quelqu'un se souvient où c'est? J'ai besoin de créer une application avec un petit langage macro et j'adorerais utiliser C# comme langage macro, mais je ne sais pas où trouver cette bibliothèque.

Répondre

11

Vous pouvez utiliser CSharpCodeProvider class pour compiler des assemblys lors de l'exécution.

Vous devez créer un modèle standard pour placer les commandes de macro dans une méthode statique dans une classe.

Par exemple:

static readonly Assembly[] References = new[] { typeof(Enumerable).Assembly, typeof(Component).Assembly }; 
public Action CompileMacro(string source) { 
    var options = new CompilerParameters(References.Select(a => a.Location).ToArray()) { 
     GenerateInMemory = true 
    }; 
    string fullSource = @"public static class MacroHolder { public static void Execute() { \r\n" + source + "\r\n} }"; 
    try { 
     var compiler = new CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v4.0" } }); 

     var results = compiler.CompileAssemblyFromSource(options, fullSource); 

     if (results.Errors.Count > 0) 
      throw new InvalidOperationException(String.Join(
       Environment.NewLine, 
       results.Errors.Cast<CompilerError>().Select(ce => ce.ErrorText) 
      )); 

     return (Action)Delegate.CreateDelegate(
      typeof(Action), 
      results.CompiledAssembly.GetType("MacroHolder").GetMethod("Execute") 
     ); 
    } finally { options.TempFiles.Delete(); } 
} 
+4

C'est la seule réponse disponible maintenant. La vidéo dont vous parlez montre le "compilateur en tant que service", qui est provisoirement prévu pour C# 5. –

+0

Voir aussi: http://stackoverflow.com/questions/2210734/what-is-the-state-of -le-c-compilateur-comme-un-service –

+0

Nice, merci pour l'aide tout le monde! – Kelly

2

Vous ne savez pas d'où vous parlez? est plus, mais ce dont vous parlez est un shell interactif.

Le seul que je me rappelle avoir vu est le CSharpRepl qui a été publié par l'équipe Mono. CSharpRepl contient également la fonctionnalité Compiler as a Service que l'équipe Mono a développée.

0

Peut-être que vous voulez dire CodePad.NET? Eh bien, ce n'est pas une application de ligne de commande, mais il est open-source et pourrait vous diriger dans la bonne direction.

1

Vous pouvez essayer CS-Script comme alternative - vous permet d'exécuter des fichiers C# individuels comme s'ils étaient des fichiers de script.

1

Si vous êtes ouvert à d'autres suggestions, vous pouvez utiliser Python ou F # ou Boo comme langage macro aujourd'hui.

Je préfère Python, moi-même; C'est l'une des langues les mieux conçues. C# a beaucoup emprunté à Python dans ses développements ultérieurs (blocs d'itérateur, lambdas, ...).

Publications de Manning a un livre appelé IronPython in Action; le chapitre 15 traite de l'utilisation de IronPython dans d'autres programmes (en tant que moteur de script, ou en tant que plugins).

0

Je n'irais pas Python, il n'a pas l'infrastructure .NET, par conséquent vous êtes limité.

F # est incroyable.

+3

Que voulez-vous dire par "n'a pas l'infrastructure .NET"? IronPython est un langage .NET de première classe. – Niki

0

Le compilateur-as-a-service Cette fonction a été available in Mono depuis un certain temps et il y a des signes qu'il pourrait apparaître dans .NET 5 ou 6, mais ce n'est pas disponible dans .NET 4.

Si vous absolument, positivement, besoin de fonctionner. NET (notez que Mono fonctionne très bien sur Windows, donc vous ne perdez rien en exécutant Mono), une option intéressante pourrait être d'enquêter sur comment il serait difficile de porter Mono.CSharp à. NET. Je veux dire, finalement, à un moment donné, il génère un bytecode CIL qui fonctionne exactement de la même manière pour toutes les implémentations CLI que ce soit Mono, .NET, DotGNU, Rotor, Bartok ou autre.

Sinon, vos options sont à peu près les mêmes qu'ils ont toujours été: générer des fichiers et appeler le Compier de ligne de commande, utilisez les arbres DLR, utilisez la génération de code léger, utilisez Reflection.Emit, utilisez CodeDOM, utilisez CSharpCodeProvider, créez votre propre langage de script, héberger un autre langage de script ou héberger le DLR.

J'irais probablement pour le dernier: héberger le DLR est absolument facile et il vous donne accès à non seulement un mais plusieurs bons langages de script (actuellement Ruby, Python, ECMAScript et Scheme) et en fait l'utilisateur peut utiliser n'importe quel langage DLR qu'ils ont installé sur leur machine.