Компиляция CLR во время выполнения

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

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

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

Благодарю вас !


person Antoine Trouve    schedule 30.09.2010    source источник
comment
Вы имеете в виду создание CIL (он же IL)? Нет смысла говорить о генерации CLR.   -  person Jon Skeet    schedule 30.09.2010
comment
Хм, вы правы, я имел в виду CIL, конечно.   -  person Antoine Trouve    schedule 14.10.2010


Ответы (3)


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

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

person Jon Skeet    schedule 30.09.2010
comment
Спасибо за ответ. Я взглянул на это пространство имен и, в частности, на ILGenerator, который, похоже, был тем, что я искал. Я рассмотрю это более подробно, особенно в отношении скорости. - person Antoine Trouve; 30.09.2010

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

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

person Gabe    schedule 30.09.2010
comment
Я не знал о деревьях выражений; это лучше, чем CODEDOM, который я использовал некоторое время назад. Но я искал более низкоуровневое решение. - person Antoine Trouve; 30.09.2010

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

person Joel Marcey    schedule 30.09.2010
comment
Вы правы, поэтому мой вопрос был о том, как это сделать. Извините за недостаточно ясность. - person Antoine Trouve; 30.09.2010