2009-07-29 5 views
12

Tengo el siguiente código bastante estándar como un contenedor alrededor de CSharpCodeProvider. Esta clase funciona muy bien, funciona perfectamente, etc., etc. Pero, a pesar de que mi aplicación está desarrollada en .NET 3.5 y hace referencia a los ensamblados v3.5 al hacer esta compilación, todavía no tengo acceso a ninguna de la sintaxis extra agradable C# 3.5 como lambda's o auto-propiedades. ¿Hay alguna forma de hacer que esto funcione?CSharpCodeProvider parece estar estancado en .NET 2.0, ¿cómo obtengo nuevas características?

Tenía la impresión de que esta clase simplemente se ajustaba a csc.exe, una idea que parecería confirmada por mi firewall (mi aplicación intenta acceder al csc.exe). Tal vez solo necesito establecer options.CompilerOptions en algo?

protected virtual void Compile() 
{ 
    Microsoft.CSharp.CSharpCodeProvider csProvider = new Microsoft.CSharp.CSharpCodeProvider(); 

    CompilerParameters options = new CompilerParameters(); 
    options.GenerateExecutable = false; 
    options.GenerateInMemory = true; 
    options.IncludeDebugInformation = true; 

    foreach (string s in this.ReferencedAssemblies) 
    { 
     options.ReferencedAssemblies.Add(s); 
    } 

    CompilerResults result; 
    string source = this.CodeTemplate; 

    // [snip] Do some manipulation to fill in the template with values. 

    result = csProvider.CompileAssemblyFromSource(options, source); 

    this.HasErrors = result.Errors.HasErrors; 
    this.Errors = new CompilerError[result.Errors.Count]; 
    result.Errors.CopyTo(Errors, 0); 

    if (HasErrors && ThrowOnErrors) 
     throw new InvalidProgramException("The code currently stored in the " + this.GetType() + " cannot be compiled."); 
    else if (HasErrors) 
     return; 
    this.CompiledAssembly = result.CompiledAssembly; 
} 

EDIT:

Tengo referencias a mscorlib, System.Core, System.Text y uno de mis propios montajes en el momento.

+0

3.5 está construido sobre el Marco 2.0. –

Respuesta

25

Hay una bandera compilador que puede pasar en el constructor (en un diccionario):

Dictionary<string,string> options = new Dictionary<string,string> 
{ 
    { "CompilerVersion", "v3.5" } 
}; 

var compiler = new CSharpCodeProvider(options); 

Eso es lo que ha funcionado para mí, de todos modos ...

+0

+1: escribí un contenedor simple para esto con los valores enum para las versiones de framework para poder especificar qué partes de la aplicación admiten qué compilador. –

+0

Elogie a Google por encontrar esta vieja respuesta. Me ahorró un montón de tiempo, ya que esto podría documentarse mejor en msdn. +1 –

0

En los ensamblados a los que se hace referencia, intente agregar una referencia a System.Core. Deberias hacer eso. Mucha funcionalidad 3.5 está ahí. Si eso no funciona, abra las propiedades de compilación para su proyecto actual y verifique qué otros ensamblajes puede tener que cargar.

+1

Ver mi edición, pero ¿las referencias realmente harían una diferencia en el comportamiento del compilador? –

+3

No, no lo harían. Desea las características del lenguaje C# 3.0, no (necesariamente) la biblioteca de clases .NET framework 3.5. Uno no requiere el otro. – Lucas

Cuestiones relacionadas