Utilizzo di CSharpCodeProvider con .net 4.5 beta

Recentemente ho installato Visual Studio 11 Beta e sto tentando di aggiornare un progetto 4.0 esistente per utilizzare 4.5. Nel programma compila un codice generato dynamicmente usando CSharpCodeProvider .

 ///  /// Compile and return a reference to the compiled assembly ///  private Assembly Compile() { var referencedDlls = new List { "mscorlib.dll", "System.dll", "System.Core.dll", }; referencedDlls.AddRange(RequiredReferences); var parameters = new CompilerParameters( assemblyNames: referencedDlls.ToArray(), outputName: GeneratedDllFileName, // only include debug information if we are currently debugging includeDebugInformation: Debugger.IsAttached); parameters.TreatWarningsAsErrors = false; parameters.WarningLevel = 0; parameters.GenerateExecutable = false; parameters.GenerateInMemory = false; parameters.CompilerOptions = "/optimize+ /platform:x64"; string[] files = Directory.GetFiles(GenerationDirectory, "*.cs"); var compiler = new CSharpCodeProvider( new Dictionary { { "CompilerVersion", "v4.5" } }); var results = compiler.CompileAssemblyFromFile(parameters, files); if (results.Errors.HasErrors) { string firstError = string.Format("Compile error: {0}", results.Errors[0].ToString()); throw new ApplicationException(firstError); } else { return results.CompiledAssembly; } } 

Il problema si presenta quando ho cambiato il CompilerVersion da { "CompilerVersion", "v4.0" } a { "CompilerVersion", "v4.5" }

Ora ottengo un’eccezione

Imansible trovare il file eseguibile del compiler csc.exe.

Specificare CompilerVersion il modo sbagliato per dirgli di usare 4.5? Riuscirà a compilarlo come v4.5 anche a fare la differenza dal momento che il codice non userà nessuna nuova caratteristica specifica 4.5?

Sarebbe stato utile se ci avessi fornito un programma breve ma completo per dimostrare il problema, ma posso verificare che con “v4.0” funzioni e compili metodi asincroni, assumendo che tu stia girando su una macchina con VS11 beta installato.

Dimostrazione:

 using System; using System.Collections; using System.Reflection; using System.Collections.Generic; using System.Diagnostics; using Microsoft.CSharp; using System.CodeDom.Compiler; namespace Foo {} class Program { static void Main(string[] args) { var referencedDll = new List { "mscorlib.dll", "System.dll", "System.Core.dll", }; var parameters = new CompilerParameters( assemblyNames: referencedDll.ToArray(), outputName: "foo.dll", includeDebugInformation: false) { TreatWarningsAsErrors = true, // We don't want to be warned that we have no await! WarningLevel = 0, GenerateExecutable = false, GenerateInMemory = true }; var source = new[] { "class Test { static async void Foo() {}}" }; var options = new Dictionary { { "CompilerVersion", "v4.0" } }; var compiler = new CSharpCodeProvider(options); var results = compiler.CompileAssemblyFromSource(parameters, source); Console.WriteLine("Success? {0}", !results.Errors.HasErrors); } }