Связывание дерева выражений .NET в новую сборку - PullRequest
5 голосов
/ 24 октября 2009

Я пытаюсь написать свой собственный компилятор My Toy Language -> MSIL, чтобы лучше понять, как работают компиляторы. Я получил синтаксический анализ и лексинг, я построил деревья выражений и, используя API дерева выражений System.Linq.Expressions, у меня есть рабочий интерпретатор. Теперь я хотел бы выпустить несколько реальных сборок MSIL.

Проблема в том, что я не могу понять, как на самом деле собрать эти сборки. Класс MethodBuilder принимает только необработанные тела методов MSIL, поэтому я должен получить необработанный MSIL моего дерева выражений. Вызов Expression.Compile () возвращает работающего делегата, но я не могу получить его базовый MSIL. Вызов MethodInfo.GetMethodBody () вызывает исключение InvalidOperationException, поскольку оно не реализовано в этом конкретном дочернем классе.

Как связать этого делегата с новой сборкой?

Ответы [ 2 ]

3 голосов
/ 25 октября 2009

только что нашел. Версия LambdaExpression для DLR предоставляет метод CompileToMethod, который делает именно то, что мне нужно.

lambdaExpression.CompileToMethod(myMethodBuilder);
0 голосов
/ 24 октября 2009

Чтобы испускать сырой IL, вам нужно определить свой собственный AST. Вам нужно получить AssemblyBuilder, затем ModuleBuilder, а затем вы можете определить метод уровня модуля или получить новый TypeBuilder и теперь MethodBuilder для определения метода уровня класса.

Вы сказали, что у вас уже есть лексер и парсер. это означает, что вы можете построить АСТ. Так что просто пройдитесь по разобранным выражениям и испустите свой IL.

Даже если вы получите сгенерированный (путем компиляции) код, вы не сможете с ним что-то сделать полезного, поскольку сгенерированный код зависит от инфраструктуры. Например, если вам нужно скомпилировать замыкания, вы должны создать класс или другое хранилище для лексических переменных и т. Д. (Например, не лексическая передача управления, которая требует использования исключений в .net)

...