2012-03-06 32 views
5

Instalé recientemente el Visual Studio 11 Beta, y estoy tratando de actualizar un proyecto 4.0 existente para usar 4.5. En el programa, compila código generado dinámicamente usando CSharpCodeProvider.Usando CSharpCodeProvider con .net 4.5 beta

/// <summary> 
/// Compile and return a reference to the compiled assembly 
/// </summary> 
private Assembly Compile() 
{ 
    var referencedDlls = new List<string> 
    { 
     "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<string, string> { { "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; 
    } 
} 

El problema viene cuando he cambiado el CompilerVersion{ "CompilerVersion", "v4.0" }-{ "CompilerVersion", "v4.5" }

Ahora recibe una excepción

Compilador csc.exe archivo ejecutable no se puede encontrar.

¿Está especificando CompilerVersion la forma incorrecta de indicarle que use 4.5? ¿Compilarlo como v4.5 incluso marcará la diferencia ya que el código no usará ninguna nueva característica específica de 4.5?

+2

No sé si está mal para especificar la versión del compilador así, pero el compilador Fwiw en .NET 4.5 sigue siendo la versión 4.0 de acuerdo con la salida. –

+0

¿Por qué solo devuelve el primer error? – abatishchev

+0

@abatishchev Dado que el código que estoy compilando está autogenerado, normalmente no debería haber ningún error a menos que la plantilla esté en mal estado, solo devolver el primero evita que devuelva posiblemente miles de errores, lo que resultaría en un error muy largo correo electrónico y realmente no ser más útil – BrandonAGr

Respuesta

9

Hubiera sido útil si nos hubiera dado un programa breve pero completo para demostrar el problema, pero puedo verificar que con "v4.0" funcionará y compilará métodos asíncronos, suponiendo que se está ejecutando en un máquina con el VS11 beta instalado.

Demostración:

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<string> 
     { 
      "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<string, string> { 
      { "CompilerVersion", "v4.0" } 
     }; 
     var compiler = new CSharpCodeProvider(options); 
     var results = compiler.CompileAssemblyFromSource(parameters, source); 

     Console.WriteLine("Success? {0}", !results.Errors.HasErrors); 
    } 
} 
+1

¿Sigue siendo la versión 4.0 porque 4.5 todavía está en versión beta? ¿La versión de CompilerVersion será superada en la versión final? Además, ¿CompilerVersion es la versión de framework o la versión de compilador de C#? – BFree

+0

Gracias, parece que desde 4.5 se instala sobre 4 y tiene el mismo número de versión. No necesito cambiar CompilerVersion para usar 4.5 – BrandonAGr

+0

@BFree: no me gustaría decirlo, para ser honesto. –

Cuestiones relacionadas