2009-07-29 9 views
12

Ho il seguente codice abbastanza standard come wrapper attorno a CSharpCodeProvider. Questa classe funziona molto bene, e funziona bene, ecc. Ecc. Ma, nonostante il fatto che la mia applicazione sia costruita contro .NET 3.5 e fa riferimento agli assembly v3.5 quando si esegue questa compilation, non riesco ancora ad accedere a qualsiasi della sintassi C# 3.5 extra come le lambda o le proprietà automatiche. C'è un modo per farlo funzionare?CSharpCodeProvider sembra essere bloccato su .NET 2.0, come posso ottenere nuove funzionalità?

Avevo l'impressione che questa classe si fosse appena spostata attorno allo csc.exe, un'idea che sembrerebbe essere confermata dal mio firewall (la mia applicazione tenta di accedere a csc.exe). Forse ho solo bisogno di impostare options.CompilerOptions a qualcosa?

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:

ho riferimenti a mscorlib, System.Core, System.Text e uno dei miei gruppi al momento.

+0

3.5 si basa sul Framework 2.0. –

risposta

25

C'è un flag di compilazione che è possibile passare al costruttore (in un dizionario):

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

var compiler = new CSharpCodeProvider(options); 

questo è quello che ha funzionato per me, comunque ...

+0

+1: Ho scritto un semplice wrapper per questo con valori enum per le versioni framework in modo da poter specificare quali parti dell'app supportano quale compilatore. –

+0

Lode a google per aver trovato questa vecchia risposta. Mi ha salvato un sacco di tempo, dato che questo potrebbe davvero essere documentato meglio in msdn. +1 –

0

Negli assembly di riferimento, provare ad aggiungere un riferimento a System.Core. Questo dovrebbe farlo. C'è un sacco di funzionalità 3.5. Se ciò non avviene, apri le proprietà di compilazione per il tuo progetto corrente e controlla quali altri assembly potresti dover caricare.

+1

Vedere la mia modifica, ma i riferimenti farebbero davvero una differenza per il comportamento del compilatore? –

+3

No, non lo farebbero. Volete caratteristiche del linguaggio C# 3.0, non (necessariamente) la libreria di classi .NET framework 3.5. Uno non richiede l'altro. – Lucas

Problemi correlati