Компиляция CLR во время выполнения - PullRequest
1 голос
/ 30 сентября 2010

У меня есть приложение на C #, которое генерирует функции .NET во время выполнения и выполняет их. Для этого он генерирует C # в строках и вызывает онлайн-компилятор C # для преобразования его в CLR для JIT-компиляции и выполнения.

По соображениям производительности я хотел бы иметь возможность генерировать непосредственно CLR (в строках или через внутреннее представление) и выполнять его без использования какого-либо компилятора (но, возможно, компилятора JIT).

Это возможно? Я видел несколько статей о внедрении кода, но это не совсем соответствует требованиям.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 30 сентября 2010

Я подозреваю, что System.Reflection.Emit - это то, что вы ищете. В частности, если вы хотите сгенерировать только один метод, я полагаю, вам следует взглянуть на DynamicMethod . Вы можете попросить его создать ILGenerator , собрать IL, а затем он будет скомпилирован JIT при преобразовании метода в делегат.

Я не верю, что вы можете просто дать ему текстовый IL, хотя ... вы будете использовать API, явно создавая различные инструкции. Там может быть парсер IL, который использует это, хотя ...

2 голосов
/ 30 сентября 2010

Если вы просто хотите создать .Net функции, Деревья выражений - путь.Если вы хотите создать целый класс, вы можете использовать Reflection.Emit , но тогда вы пишете ассемблерный код.

Если вы ждете .Net 5, возможно, ониверсия компилятора, в которую вы можете передавать произвольный код C #, но на данный момент, возможно, вы можете использовать что-то, что использует DLR (например, IronPython) для передачи фактического исходного кода.

0 голосов
/ 30 сентября 2010

Я, возможно, не понимаю вопроса, но не могли бы вы, вместо генерации кода C # из вашего приложения, фактически сгенерировать эквивалентный код промежуточного языка (IL), который компилятор C # все равно сгенерирует? Тогда вы можете просто запустить код IL напрямую, без предварительной компиляции.

...