Информация об изменениях

Сообщение Re: CSharpCodeProvider - как заюзать новые фичи языка (ответ от 24.04.2019 19:02

Изменено 24.04.2019 19:10 alexzzzz

Re: CSharpCodeProvider - как заюзать новые фичи языка (ответ)
Здравствуйте, Kolesiki, Вы писали:

K>в нововышедшем FW 4.8 вы НЕ МОЖЕТЕ использовать свежий компилятор!


Можно было не писать гневную простыню, а просто спросить. Современный Розлин обитает на nuget и к фреймвоку не привязан. А то что во фреймвоке лежит что-то старое, за 20 лет там много чего лежит старого, например типа ArrayList.

1. Подключаешь к проекту пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform
2. Пользуешься:
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CodeDom.Providers.DotNetCompilerPlatform;

public class Program
{
    private static void Main()
    {
        string code = "class Foo { static void Hello(string name) { System.Console.WriteLine($\"Hello, {name}!\"); } }";

        var assembly = Compile(code);
        var hello = (Action<string>)assembly.GetType("Foo").GetMethod("Hello", BindingFlags.Static | BindingFlags.NonPublic).CreateDelegate(typeof(Action<string>));
        hello("Vasya");

    }

    private static Assembly Compile(string code)
    {
        var codeProvider = new CSharpCodeProvider();
        var parameters = new CompilerParameters { GenerateInMemory = true };
        var compilerResults = codeProvider.CompileAssemblyFromSource(parameters, code);
        return compilerResults.CompiledAssembly;
    }
}

Hello, Vasya!
Press any key to continue . . .
Re: CSharpCodeProvider - как заюзать новые фичи языка (ответ
Здравствуйте, Kolesiki, Вы писали:

K>в нововышедшем FW 4.8 вы НЕ МОЖЕТЕ использовать свежий компилятор!


Можно было не писать гневную простыню, а просто спросить. Современный Розлин обитает на nuget и к фреймвоку не привязан. А то что во фреймвоке лежит что-то старое, за 20 лет там много чего лежит старого, например тип ArrayList.

1. Подключаешь к проекту пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform
2. Пользуешься:
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CodeDom.Providers.DotNetCompilerPlatform;

public class Program
{
    private static void Main()
    {
        string code = "class Foo { static void Hello(string name) { System.Console.WriteLine($\"Hello, {name}!\"); } }";

        var assembly = Compile(code);
        var hello = (Action<string>)assembly.GetType("Foo").GetMethod("Hello", BindingFlags.Static | BindingFlags.NonPublic).CreateDelegate(typeof(Action<string>));
        hello("Vasya");

    }

    private static Assembly Compile(string code)
    {
        var codeProvider = new CSharpCodeProvider();
        var parameters = new CompilerParameters { GenerateInMemory = true };
        var compilerResults = codeProvider.CompileAssemblyFromSource(parameters, code);
        return compilerResults.CompiledAssembly;
    }
}

Hello, Vasya!
Press any key to continue . . .