Подтвердить что ты не робот

Как настроить таргетинг на конкретную языковую версию с помощью CodeDOM?

Используя поставщика кода С# и метода ICodeCompiler.CompileAssemblyFromSource, я пытаюсь скомпилировать файл кода, чтобы создать исполняемую сборку.

В коде, который я хотел бы скомпилировать, используются такие функции, как необязательные параметры и методы расширения, которые доступны только при использовании языка С# 4.

Сказав, что код, который я хотел бы компилировать, требует (и потребностей) для целевой версии 2.0.NET Framework.


Используя исходящий код, можно избежать любых ошибок времени компиляции, относящихся к синтаксису, однако результирующая сборка будет нацелена на версию 4.0 рамки, которая нежелательна.

var compiler = new CSharpCodeProvider(
        new Dictionary<string, string> { { "CompilerVersion", "v4.0" } } );

Как я могу сделать так, чтобы поставщик кода нацелился на язык версии 4.0, но создал сборку, для которой требуется только версия 2.0 фреймворка?

4b9b3361

Ответ 1

Вам нужно указать компилятор С# (который косвенно использует CSharpCodeProvider), который вы хотите связать с другим mscorlib.dll, используя параметр /nostdlib. Вот пример, который должен сделать это:

static void Main(string[] args)
{
    // defines references
    List<string> references = new List<string>();

    // get a reference to the mscorlib you want
    var mscorlib_2_x86 = Path.Combine(
                         Environment.GetFolderPath(Environment.SpecialFolder.Windows),
                         @"Microsoft.NET\Framework\v2.0.50727\mscorlib.dll");
    references.Add(mscorlib_2_x86);

    // ... add other references (System.dll, etc.)

    var provider = new CSharpCodeProvider(
                   new Dictionary<string, string> { { "CompilerVersion", "v4.0" } });
    var parameters = new CompilerParameters(references.ToArray(), "program.exe");
    parameters.GenerateExecutable = true;

    // instruct the compiler not to use the default mscorlib
    parameters.CompilerOptions = "/nostdlib";              

    var results = provider.CompileAssemblyFromSource(parameters,
        @"using System;

        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(""Hello world from CLR version: "" + Environment.Version);
            }
        }");
}

Если вы запустите это, он должен скомпилировать файл program.exe. Если вы запустите этот файл, он должен отобразить что-то вроде этого:

Hello world from CLR version: 2.0.50727.7905