2010-06-24 18 views
5

Recuerdo cuando .NET 4 estaba en beta, había un video de un desarrollador que creaba una aplicación de línea de comandos en la que podía escribir el código C# y compilaba el código sobre la marcha. La idea era que el compilador ahora estaba disponible en el lenguaje .NET.Compilando el código .NET en .NET 4?

¿Alguien recuerda dónde está esto? Necesito crear una aplicación con un pequeño lenguaje de macros y me encantaría usar C# como ese lenguaje de macros, pero no sé dónde encontrar esta biblioteca ...

Respuesta

11

Puede usar el CSharpCodeProvider class para compilar ensamblajes en tiempo de ejecución.

Tendrá que hacer una plantilla repetitiva para envolver los comandos de macro en un método estático en una clase.

Por ejemplo:

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

Esta es la única respuesta disponible ahora. El video al que se refiere es una demostración del "compilador como un servicio", que está planificado tentativamente para C# 5. –

+0

Vea también: http://stackoverflow.com/questions/2210734/what-is-the-state-of -the-c-compiler-as-a-service –

+0

¡Agradable, gracias por ayudar a todos! – Kelly

2

No sé dónde se está refiriendo ya no es así, pero de lo que estás hablando es de un Shell interactivo.

El único que recuerdo haber visto es el CSharpRepl que fue lanzado por el equipo de Mono. CSharpRepl también contiene la funcionalidad del Compilador como servicio que desarrolló el equipo de Mono.

0

Tal vez usted quiere decir CodePad.NET? Bueno, no es una aplicación de línea de comandos, pero es de código abierto y podría apuntarlo en la dirección correcta.

1

Puede probar CS-Script como alternativa: le permite ejecutar archivos C# individuales como si fueran archivos de script.

1

Si está abierto a otras sugerencias, puede utilizar Python o F # o Boo como un lenguaje de macros hoy.

Prefiero Python, yo mismo; es uno de los lenguajes mejor diseñados. C# ha prestado mucho de Python en sus desarrollos posteriores (bloques de iterador, lambdas, ...).

Manning Publications tiene un libro llamado IronPython in Action; el capítulo 15 trata sobre el uso de IronPython en otros programas (como motor de scripts o como complementos).

0

No iría a Python, no tiene la infraestructura .NET, por lo tanto, usted está limitado.

F # es increíble.

+3

¿Qué quiere decir con "no tiene la infraestructura .NET"? IronPython es un lenguaje .NET de primera clase. – Niki

0

El-as-a-Service Compilador característica ha sido available in Mono desde hace bastante tiempo y hay indicios de que podría aparecer en .NET 5 o 6, pero no es disponible en .NET 4.

Si absolutamente, positivamente, necesita ejecutarse en .NET (tenga en cuenta que Mono se ejecuta en Windows muy bien, por lo que en realidad no pierde nada ejecutando Mono), una opción interesante podría ser investigar qué tan difícil sería para el puerto Mono.CSharp. RED. Quiero decir, en última instancia, en algún momento, genera bytecode CIL que funciona exactamente igual en todas las implementaciones de CLI ya sea Mono, .NET, DotGNU, Rotor, Bartok o lo que sea.

De lo contrario, sus opciones son más o menos la misma que siempre han sido: generar archivos y llamar a la Compier de comandos, utilice árboles DLR, utilice la generación de código ligero, usar Reflection.Emit, utilice CodeDOM, utilice CSharpCodeProvider, crear su propio lenguaje de scripts, hospedar otro lenguaje de scripting u hospedar el DLR.

Probablemente vaya por lo último: el alojamiento del DLR es absolutamente fácil y le da acceso no solo a uno sino a varios lenguajes de scripting buenos (actualmente Ruby, Python, ECMAScript y Scheme) y de hecho el usuario puede usar cualquier lenguaje DLR que tengan instalado en su máquina.