2012-03-06 14 views
5

Kısa bir süre önce Visual Studio 11 Beta sürümünü yükledim ve mevcut bir 4.0 projesini 4.5 kullanmaya kullanmaya çalışıyorum. Programda, CSharpCodeProvider kullanarak dinamik olarak oluşturulmuş bazı kodları derler. CSharpCodeProvider'ı .net 4.5 beta ile kullanma

/// <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; 
    } 
} 

sorun

Ben { "CompilerVersion", "v4.5" }

için { "CompilerVersion", "v4.0" } den CompilerVersion değişince şimdi

Derleyici yürütülebilir dosya csc.exe bulunamayan bir istisna olsun gelir.

CompilerVersion belirtme yanlış 4.5 kullanmasını söyleyen bir yol mu? Kod 4.5 yeni bir özellik kullanmayacağından, v4.5 olarak derlemesi bile bir fark yaratır mı?

+2

o ama böyle derleyici versiyonunu belirtmek yanlışsa bilmiyorum FWIW .NET 4.5 derleyici hala çıkışa göre 4,0. –

+0

Neden sadece ilk hatayı geri veriyorsunuz? – abatishchev

+0

@abatishchev Derleme yaptığım kodun tamamı otomatik olarak oluşturulduğundan, şablon dağınık olmadıkça tipik olarak herhangi bir hata olmamalıdır, sadece ilk döndürme işlemi muhtemelen binlerce hata döndürmesini engeller, ki bu gerçekten uzun bir hatayla sonuçlanır e-posta ve gerçekten yararlı olmayacak – BrandonAGr

cevap

9

Bize sorunu göstermek için kısa ama eksiksiz bir program verdiyseniz yardımcı olabilirdi, ancak "v4.0" ile bunu çalıştıracağınızı farz edelim. VS11 beta yüklü makine.

Gösteri:

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

Hala sürüm 4.0, 4.5 hala beta olduğu için mi? CompilerVersion son sürümde çarpılacak mı? Ayrıca, CompilerVersion çerçeve sürümü veya C# derleyici sürümü nedir? – BFree

+0

Teşekkürler, 4'ün üzerinde 4.5 yükleme ve aynı sürüm numarasına sahip gibi görünüyor. 4.5 – BrandonAGr

+0

@BFree kullanmak için CompilerVersion değiştirmek zorunda değilsiniz: Dürüst olmak gerekirse, söylemek istemem. –