Использование CSharpCodeProvider с .net 4.5 beta - PullRequest
6 голосов
/ 07 марта 2012

Я недавно установил бета-версию Visual Studio 11 и пытаюсь обновить существующий проект 4.0, чтобы использовать 4.5.В программе он компилирует некоторый динамически сгенерированный код, используя CSharpCodeProvider.

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

Проблема возникает, когда я изменил CompilerVersion с { "CompilerVersion", "v4.0" } на { "CompilerVersion", "v4.5" }

Теперь я получаю исключение

Не удается найти исполняемый файл компилятора csc.exe.

Указывает CompilerVersion неправильный способ указать ему использовать 4.5?Будет ли компиляция версии v4.5 даже иметь значение, так как код не будет использовать какие-либо новые специфические функции 4.5?

1 Ответ

10 голосов
/ 07 марта 2012

Было бы полезно, если бы вы дали нам короткую, но полную программу для демонстрации проблемы, но я могу убедиться, что с "v4.0" она будет работать и компилировать асинхронные методы, если вы работаете на машинес установленной бета-версией VS11.

Демонстрация:

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);
    }
}
...