2011-04-23 2 views
24

Je suppose qu'il n'invoque pas csc.exe ou n'implémente pas un compilateur entier, alors comment ça marche?Comment LINQPad compile-t-il le code?

Mise à jour: Merci à Jon Skeet pour le pointeur vers le code qui était facile à apprendre.

string c = @" 
public class A 
{ 
    public static void Main(string[] args) 
    { 
     System.Console.WriteLine(""hello world""); 
    } 
} 
"; 

CodeDomProvider compiler = new CSharpCodeProvider(); 

CompilerParameters parameters = new CompilerParameters(); 
parameters.WarningLevel = 4; 
parameters.GenerateExecutable = false; 
parameters.GenerateInMemory = true; 

CompilerResults r = compiler.CompileAssemblyFromSource(parameters, c); 

Assembly a = r.CompiledAssembly; 

Type[] ts = a.GetTypes(); 

Type t = ts[0]; 

object o = t.GetMethod("Main").Invoke(null, new object[] { new string[] { } }); 
+0

csc.exe, il est ce qui rend le travail de System.CodeDom. Et l'IDE. –

+4

@Hans: Eh bien, presque. Il serait plus exact de dire que csc.exe et l'EDI partagent une bibliothèque commune qui effectue l'analyse de code. –

+0

+1 C'est une bonne question et Jon Skeet le fait encore! – MoonKnight

Répondre

26

De "How LINQPad Works":

LINQPad compile vos requêtes à l'aide CSharpCodeProvider de .NET (ou VBCodeProvider)

De toute évidence, il y a un peu plus à lui, mais c'est le peu que vous avez demandé à propos - lire le lien pour plus de détails.

Si vous voulez jeter un oeil à une implémentation plutôt simpliste, vous pouvez download the source code pour Snippy, le petit outil que j'ai créé pour C# en profondeur. Encore une fois, il utilise CSharpCodeProvider - et c'est un exemple assez simple que c'est facile à comprendre, avec un peu de chance. (Il y a seulement quelques classes impliquées, IIRC.)

+8

saint fume - je viens de réaliser ce que IIRC signifie .. voir, j'essayais toujours de comprendre pourquoi une interface à un protocole de chat internet semblait apparaître dans des endroits étranges :) –

+0

Illinois Interactive Report Card? – Anders

+0

@AaronAnodide Oh mon Dieu ... TOUT FAIT SENS MAINTENANT! Monsieur Skeet, vous avez éclairé beaucoup de SO-ers avec votre sagesse et nous sommes éternellement reconnaissants (si je ne le remerciais pas, je disparaîtrais probablement ce soir). – BalinKingOfMoria

10

La réponse de Jon il y a presque 5 ans est maintenant obsolète.

De "How LINQPad Works" (au 29 janvier 2016):

LINQPad 5 compile vos requêtes en utilisant les bibliothèques Microsoft Roslyn (dans le passé, et utilisés CSharpCodeProvider VBCodeProvider de .NET).

Vous pouvez voir un exemple de la façon d'utiliser Roslyn pour compiler votre code ici: Learn Roslyn Now - Part 16 - The Emit API

+3

Comment OSES-tu contredire Jon Skeet? Tu ne resteras pas impuni ... – BalinKingOfMoria

+0

La réponse de Jon était correcte quand il l'a écrite. Mais alors LINQPad 5 est arrivé. C'est incroyable! – Edward

+2

Je sais, je suis juste en train de jouer avec vous :) Merci pour une réponse à jour. – BalinKingOfMoria

Questions connexes