В качестве новшества я пытаюсь увидеть, насколько IL отличается от облегченного кода, сгенерированного во время выполнения, и кода, сгенерированного компилятором VS, поскольку я заметил, что код VS имеет тенденцию работать с другим профилем производительности. для таких вещей, как броски.
Итак, я написал следующий код:
Func<object,string> vs = x=>(string)x;
Expression<Func<object,string>> exp = x=>(string)x;
var compiled = exp.Compile();
Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
К сожалению, это вызывает исключение, поскольку GetMethodBody, по-видимому, является недопустимой операцией над кодом, сгенерированным деревьями выражений. Как я могу библиотечным способом (т.е. не с помощью внешнего инструмента, если у инструмента нет API) посмотреть на код, сгенерированный кодом с использованием облегченного codegen?
Редактировать: ошибка возникает в строке 5, compiled.Method.GetMethodBody () генерирует исключение.
Edit2:
Кто-нибудь знает, как восстановить локальные переменные, объявленные в методе? Или нет способа получить GetVariables?