Компиляция кода .NET в .NET 4? - PullRequest
5 голосов
/ 24 июня 2010

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

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

Ответы [ 7 ]

11 голосов
/ 24 июня 2010

Вы можете использовать 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(); }
}
2 голосов
/ 24 июня 2010

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

Я помню только то, что CSharpRepl был выпущен командой Mono.CSharpRepl также содержит функциональность Compiler As a Service, разработанную командой Mono.

1 голос
/ 24 июня 2010

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

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

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

1 голос
/ 24 июня 2010

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

0 голосов
/ 24 июня 2010

Функция 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 голосов
/ 24 июня 2010

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

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

0 голосов
/ 24 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...