Я использую System.Reflection.Emit какое-то время и считаю его (а кто этого не делает?) Таким же болезненным, как и подверженность ошибкам.
Знаете ли вы, есть ли хорошая оболочка вокруг генератора IL, на которую я могу положиться, чтобы генерировать IL более безопасным и простым способом, чем при непосредственной игре с SRE?
Редактировать:
Я знаю, что манипулировать деревьями выражений определенно проще и безопаснее, чем напрямую испускать IL, но прямо сейчас у них есть некоторые ограничения. Я не могу создавать блоки кода, использовать циклы, объявлять и работать с несколькими локальными и т.д. Нам нужно дождаться выхода .NET 4 :)
Более того, я имею дело с базой кода, которая уже опирается на SRE.
Очевидно, ILGenerator сделает все, что мне нужно. Но я был бы признателен за дополнительную помощь при манипулировании им. Когда я говорю об оболочке ILGenerator, которая остается на довольно низком уровне, я думаю о чем-то, что могло бы предоставлять такие методы, как:
// Performs a virtual or direct call on the method, depending if it is a
// virtual or a static one.
Call(MethodInfo methodInfo)
// Pushes the default value of the type on the stack, then emit
// the Ret opcode.
ReturnDefault(Type type)
// Test the object type to emit the corresponding push
// opcode (Ldstr, Ldc_I*, Ldc_R*, etc.)
LoadConstant(object o)
Это действительно 3 наивных примера, но этого может быть достаточно, чтобы продемонстрировать то, чего я ожидаю. Мы можем видеть это как набор методов расширения, но было бы неплохо иметь поддержку условных операторов и циклов, как в RunSharp. Фактически, RunSharp довольно близок к тому, что я хочу, но он слишком абстрагирует ILGenerator и не раскрывает всю его функциональность.
Не помню где, но я уже видел такого помощника в проекте с открытым кодом.
Это верная точка зрения; Я обновил вопрос, чтобы уточнить детали.
Фактически, поскольку выражения являются лямбда-выражениями, вы должны иметь возможность использовать цикл, реализованный как оператор рекурсии + Y.
Как вы звоните оператору Y?
Я думаю, это называется Y комбинатор - погуглите.
Ответ на этот вопрос - ГОЛОСОВАЯ СИГНАЛИЗАЦИЯ! github.com/kevin-montrose/Sigil и отличный образец на нем gist.github.com/bretcope/a9dea0c5c67b0bc051c8





Если вы используете .NET 3.5, вы можете найти использование деревьев выражений более разумным. Это полностью зависит от того, что вы делаете - и это может быть довольно болезненно, - но это, безусловно, еще один вариант, о котором следует знать.
К сожалению, я все еще использую .NET 2.0. Я мог бы использовать реализацию класса Expression в Mono, но деревья выражений не могут справиться с тем, что я собираюсь делать (блоки кода, несколько локальных распределений и т. д.)
Деревья расширений бесполезны при реализации сложных типов. Только при работе с методами.
[обновлено]: я подумал о названии ;-p RunSharp. Я не могу поручиться за это, но, возможно, это то, что вам нужно.
Тем не мение; что вам нужно сгенерировать? CodeDom - один из вариантов. Что касается создания методов, вы можете обнаружить, что можете сделать намного больше, чем ожидаете, с классом Выражение в .NET 3.5 (после его компиляции в типизированный делегат через Expression.Lambda / Compile.
Мне известно о RunSharp, и я искал что-то вроде того, что работает на более низком уровне. Я предпочитаю держаться подальше от CodeDom, даже если во многих случаях это хорошее решение. Большую часть времени я придерживаюсь DynamicMethods.
В ПОРЯДКЕ; второстепенная мысль, но вы, возможно, включили это (и ваше требование 2.0) в исходный вопрос ... Что касается «нижнего уровня» - какой уровень (между RunSharp и ILGenerator) вы ищете?
Вы правы, я добавил немного информации в исходный вопрос. Спасибо за вашу помощь!
Попробуйте использовать Mono.Cecil
Cecil is a library written by Jb Evain to generate and inspect programs and libraries in the ECMA CIL format. It has full support for generics, and support some debugging symbol format.
Вы не указали, чего не делает ILGenerator и что будет делать «хорошая» оболочка.