2011-04-23 21 views
24

Supongo que ni invoca csc.exe ni implementa un compilador completo, entonces, ¿cómo funciona?¿Cómo funciona el código de compilación LINQPad?

Actualización: Gracias a Jon Skeet por el puntero al código que fue fácil de aprender.

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, es lo que hace que el trabajo System.CodeDom. Y el IDE. –

+4

@Hans: Bueno, casi. Sería más exacto decir que tanto csc.exe como el IDE comparten una biblioteca común que realiza análisis de código. –

+0

+1 ¡Esta es una gran pregunta y Jon Skeet lo hace OTRA VEZ! – MoonKnight

Respuesta

26

De "How LINQPad Works":

LINQPad compila sus consultas utilizando CSharpCodeProvider de .NET (o VBCodeProvider)

Obviamente hay bastante más que eso, pero eso es el bit que preguntaste - leer el enlace para más detalles.

Si desea echar un vistazo a una implementación bastante más simple, podría download the source code para Snippy, la pequeña herramienta que creé para C# en profundidad. Nuevamente, usa CSharpCodeProvider - y es un ejemplo bastante simple que es fácil de entender, con un poco de suerte. (Hay solo unas pocas clases involucradas, IIRC.)

+8

holy smokes - AHORA me di cuenta de lo que significa IIRC ... vea, siempre estaba tratando de entender por qué una interfaz a un protocolo de chat de Internet parecía aparecer en lugares extraños :) –

+0

Illinois Interactive Report Card? – Anders

+0

@AaronAnodide ¡Oh Dios mío ... TODO TIENE SENTIDO AHORA! Sr. Skeet, usted ha iluminado a muchos SO-ers con su sabiduría y estamos eternamente agradecidos (si no le di las gracias, probablemente desaparecería esta noche). – BalinKingOfMoria

10

La respuesta de Jon de hace casi 5 años ahora está desactualizada.

De "How LINQPad Works" (al 29 Ene 2016):

LINQPad 5 compila sus consultas utilizando las bibliotecas de Microsoft Roslyn (en el pasado solía CSharpCodeProvider y VBCodeProvider de .NET).

Se puede ver un ejemplo de cómo utilizar Roslyn para compilar el código aquí: Learn Roslyn Now - Part 16 - The Emit API

+3

¿Cómo te atreves a contradecir a Jon Skeet? No quedarás impune ... – BalinKingOfMoria

+0

La respuesta de Jon fue correcta cuando la escribió. Pero luego apareció LINQPad 5. ¡Es asombroso! – Edward

+2

Lo sé, solo estoy jugando contigo :) Gracias por una respuesta actualizada. – BalinKingOfMoria

Cuestiones relacionadas