Есть ли хорошая обертка вокруг ILGenerator?

Я использую 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 и не раскрывает всю его функциональность.

Не помню где, но я уже видел такого помощника в проекте с открытым кодом.

Вы не указали, чего не делает ILGenerator и что будет делать «хорошая» оболочка.

Nick Johnson 13.10.2008 12:57

Это верная точка зрения; Я обновил вопрос, чтобы уточнить детали.

Romain Verdier 13.10.2008 19:02

Фактически, поскольку выражения являются лямбда-выражениями, вы должны иметь возможность использовать цикл, реализованный как оператор рекурсии + Y.

TraumaPony 13.10.2008 19:03

Как вы звоните оператору Y?

Romain Verdier 13.10.2008 19:23

Я думаю, это называется Y комбинатор - погуглите.

Anton Tykhyy 24.03.2009 11:01

Ответ на этот вопрос - ГОЛОСОВАЯ СИГНАЛИЗАЦИЯ! github.com/kevin-montrose/Sigil и отличный образец на нем gist.github.com/bretcope/a9dea0c5c67b0bc051c8

Chris Marisic 23.06.2016 17:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
6
3 655
3

Ответы 3

Если вы используете .NET 3.5, вы можете найти использование деревьев выражений более разумным. Это полностью зависит от того, что вы делаете - и это может быть довольно болезненно, - но это, безусловно, еще один вариант, о котором следует знать.

К сожалению, я все еще использую .NET 2.0. Я мог бы использовать реализацию класса Expression в Mono, но деревья выражений не могут справиться с тем, что я собираюсь делать (блоки кода, несколько локальных распределений и т. д.)

Romain Verdier 13.10.2008 12:47

Деревья расширений бесполезны при реализации сложных типов. Только при работе с методами.

Felix K. 22.02.2012 16:31

[обновлено]: я подумал о названии ;-p RunSharp. Я не могу поручиться за это, но, возможно, это то, что вам нужно.

Тем не мение; что вам нужно сгенерировать? CodeDom - один из вариантов. Что касается создания методов, вы можете обнаружить, что можете сделать намного больше, чем ожидаете, с классом Выражение в .NET 3.5 (после его компиляции в типизированный делегат через Expression.Lambda / Compile.

Мне известно о RunSharp, и я искал что-то вроде того, что работает на более низком уровне. Я предпочитаю держаться подальше от CodeDom, даже если во многих случаях это хорошее решение. Большую часть времени я придерживаюсь DynamicMethods.

Romain Verdier 13.10.2008 12:51

В ПОРЯДКЕ; второстепенная мысль, но вы, возможно, включили это (и ваше требование 2.0) в исходный вопрос ... Что касается «нижнего уровня» - какой уровень (между RunSharp и ILGenerator) вы ищете?

Marc Gravell 13.10.2008 13:03

Вы правы, я добавил немного информации в исходный вопрос. Спасибо за вашу помощь!

Romain Verdier 13.10.2008 19:01

Попробуйте использовать 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.

Другие вопросы по теме