Компиляция.NET кодирует в.NET 4?

Я помню, когда.NET 4 была в бета-версии было видео разработчика, который сделал приложение командной строки, в которое он мог ввести код C#, и это скомпилирует код на лету. Идея состояла в том, что компилятор был теперь доступен на языке.NET.

Кто-либо вспоминает, где это? Я должен создать приложение с маленьким макроязыком, и я хотел бы использовать C# в качестве того макроязыка, но я не знаю, где найти эту библиотеку..

5
задан Kelly 24 June 2010 в 15:02
поделиться

7 ответов

. Вы можете использовать CSharpCodeProvider класс для компиляции сборок во время выполнения.

Вам нужно будет создать шаблонный шаблон, чтобы обернуть макрокоманды в статический метод класса.

Например:

static readonly Assembly[] References = new[] { typeof(Enumerable).Assembly, typeof(Component).Assembly };
public Action CompileMacro(string source) {
    var options = new CompilerParameters(References.Select(a => a.Location).ToArray()) {
        GenerateInMemory = true
    };
    string fullSource = @"public static class MacroHolder { public static void Execute() { \r\n" + source + "\r\n} }";
    try {
        var compiler = new CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v4.0" } });

        var results = compiler.CompileAssemblyFromSource(options, fullSource);

        if (results.Errors.Count > 0)
            throw new InvalidOperationException(String.Join(
                Environment.NewLine, 
                results.Errors.Cast<CompilerError>().Select(ce => ce.ErrorText)
            ));

        return (Action)Delegate.CreateDelegate(
            typeof(Action),
            results.CompiledAssembly.GetType("MacroHolder").GetMethod("Execute")
        );
    } finally { options.TempFiles.Delete(); }
}
11
ответ дан 18 December 2019 в 11:53
поделиться

Не уверен, где находится тот, о котором вы говорите, но то, о чем вы говорите, - это интерактивная оболочка.

Я помню, что видел только CSharpRepl , выпущенный командой Mono. CSharpRepl также содержит функцию «Компилятор как услуга», разработанную командой Mono.

2
ответ дан 18 December 2019 в 11:53
поделиться

Если вы открыты для других предложений, вы можете использовать Python, F # или Boo в качестве макроязыка сегодня.

Я предпочитаю Python; это один из лучших языков программирования. C # во многом заимствовал у Python в своих более поздних разработках (блоки итераторов, лямбда-выражения, ...).

У Manning Publications есть книга под названием IronPython в действии ; Глава 15 посвящена использованию IronPython в других программах (в качестве механизма написания сценариев или в качестве подключаемых модулей).

1
ответ дан 18 December 2019 в 11:53
поделиться

Вы можете попробовать CS-Script в качестве альтернативы - позволяет запускать отдельные файлы C #, как если бы они были файлами сценария.

1
ответ дан 18 December 2019 в 11:53
поделиться

Может быть, вы имеете в виду CodePad.NET ? Что ж, это не приложение командной строки, но оно с открытым исходным кодом и может указать вам правильное направление.

0
ответ дан 18 December 2019 в 11:53
поделиться

Я бы не переходил на Python, у него нет инфраструктуры .NET, поэтому вы ограничены.

F# - это потрясающе.

0
ответ дан 18 December 2019 в 11:53
поделиться

Функция Compiler-as-a-Service была доступна в Mono уже довольно давно, и есть признаки того, что она может появиться в .NET 5 или 6, но она не доступна в .NET 4.

Если вам абсолютно, позитивно, необходимо работать на . NET (обратите внимание, что Mono прекрасно работает под Windows, так что вы ничего не теряете, если используете Mono), одним из интересных вариантов может быть исследование того, насколько сложно будет перенести Mono.CSharp на .NET. Я имею в виду, что в конечном итоге, в какой-то момент, он генерирует байткод CIL, который работает одинаково во всех реализациях CLI, будь то Mono, .NET, DotGNU, Rotor, Bartok или что-то еще.

В остальном, ваши варианты практически те же, что и всегда: генерировать файлы и вызывать компилятор командной строки, использовать деревья DLR, использовать облегченную генерацию кода, использовать Reflection.Emit, использовать CodeDOM, использовать CSharpCodeProvider, создать свой собственный язык сценариев, разместить какой-нибудь другой язык сценариев или разместить DLR.

Я бы, наверное, выбрал последнее: хостинг DLR абсолютно прост, и он дает вам доступ не к одному, а к нескольким хорошим скриптовым языкам (в настоящее время Ruby, Python, ECMAScript и Scheme), и фактически пользователь может использовать любой DLR-язык, установленный на его машине.

0
ответ дан 18 December 2019 в 11:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: