Возможно ли просмотреть код IL, сгенерированный при вызове команды Compile() в дереве выражений? Рассмотрим очень простой пример:Просмотр кода IL, сгенерированного из скомпилированного выражения
class Program
{
public int Value { get; set; }
static void Main(string[] args)
{
var param = Expression.Parameter(typeof(Program));
var con = Expression.Constant(5);
var prop = Expression.Property(param, typeof(Program).GetProperty("Value"));
var assign = Expression.Assign(prop, con);
Action<Program> lambda = Expression.Lambda<Action<Program>>(assign, param).Compile();
Program p = new Program();
lambda(p);
//p.Value = 5;
}
}
Теперь выражение дерево делает то, что говорит последняя строка Main
. Скомпилируйте приложение, затем откройте его в Reflector. Вы можете увидеть код IL p.Value = 5;
, который выполняет задание. Но дерево выражений было создано и скомпилировано во время выполнения. Можно ли просмотреть полученный код IL из компиляции?
Вы просто хотите * эквивалентный * IL для того, что вы делаете * * (т.е. значение свойства)? Или есть что-то о выходе 'Expression', которое вас особенно интересует? –
Ничего конкретного. Мне нравится время от времени проверять код IL. Но с выражениями вы можете сделать метод, который не получает никакого ИЛ в скомпилированной сборке. ИЛ, используемый для * создания *, имеет это дерево выражений, но не результат компиляции дерева выражений. Имеет ли это смысл? Это просто любопытство и не служит реальной практической цели, которую я вижу. – Amy
Вы пробовали с помощью великолепного ** LinqPad ** инструмента? http://www.linqpad.net/ С его помощью вы можете отображать сгенерированный код как MSIL и быстро экспериментировать практически с любым ... – AFract