2009-07-29 4 views
12

Mam następujący, dość standardowy kod jako opakowanie wokół CSharpCodeProvider. Ta klasa działa bardzo dobrze i działa dobrze, itd., Itd. Ale pomimo tego, że moja aplikacja jest zbudowana na platformie .NET 3.5 i odwołuje się do złożeń v3.5 podczas wykonywania tej kompilacji, nadal nie uzyskuję dostępu do żadnych bardzo ładnej składni C# 3.5 jak lambda lub auto-właściwości. Czy jest jakiś sposób, żeby to zadziałało?CSharpCodeProvider wydaje się utknąć w .NET 2.0, w jaki sposób uzyskać nowe funkcje?

Miałem wrażenie, że ta klasa właśnie owinięta wokół csc.exe, pomysł, który wydaje się być potwierdzony przez moją zaporę ogniową (moja aplikacja próbuje uzyskać dostęp do csc.exe). Być może po prostu muszę ustawić coś na options.CompilerOptions?

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:

mam odniesienia do mscorlib, System.Core, System.Text i jeden z moich własnych zespołów w tej chwili.

+0

3.5 jest zbudowany na Framework 2.0. –

Odpowiedz

25

Jest flag kompilatora, które można przekazać do konstruktora (w słowniku):

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

var compiler = new CSharpCodeProvider(options); 

to co pracował dla mnie, tak ...

+0

+1: Napisałem do tego proste opakowanie z wartościami wyliczeniowymi dla wersji szkieletowych, dzięki czemu mogę określić, które części aplikacji obsługują dany kompilator. –

+0

Chwała Google za znalezienie tej starej odpowiedzi. Zaoszczędził mi mnóstwo czasu, ponieważ można to naprawdę udokumentować lepiej w msdn. +1 –

0

W odwoływanych złożeniach, spróbuj dodać odniesienie do System.Core. Że należy to zrobić. Dostępnych jest wiele funkcji 3.5. Jeśli to nie pomoże, otwórz właściwości kompilacji dla bieżącego projektu i sprawdź, jakie inne podzespoły musisz załadować.

+1

Zobacz moją edycję, ale czy odniesienia naprawdę wpłyną na zachowanie kompilatora? –

+3

Nie, nie zrobiliby tego. Chcesz funkcji języka C# 3.0, niekoniecznie biblioteki biblioteki .NET Framework 3.5. Jeden nie wymaga drugiego. – Lucas

Powiązane problemy