Я использую Sigil для создания DynamicMethod
и хотел бы видеть сгенерированный Ил.Есть ли способ просмотра сгенерированного кода IL DynamicMethod (в Sigil)?
Я никогда не работал с DynamicMethods
, поэтому, возможно, есть очень очевидный ответ, но я пока ничего не нашел.
Вот similar question, но он довольно старый, и я не знаю, работает ли связанный инструмент в VS2013 - я подумал, что возможно что-то новое. Хранение сгенерированного метода в сборке и запись его на диск, вероятно, работает, но это довольно громоздко во время разработки.
Кстати, я знаю параметр out string instructions
метода Sigil's CreateDelegate
, но это не похоже на «настоящий» код IL (содержит, например, именованные метки), и я также не уверен, что это до или после оптимизации Sigil.
Редактировать: Я закончил создание динамической сборки и запись ее на диск, как предложил @svick. IL из испускаемых методов можно затем просмотреть с помощью ildasm
. В случае, если кто-то хочет сделать то же самое, вот код, который я использовал:
var asmName = new AssemblyName("MyAssembly");
var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Save);
var mod = asm.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
var typeBuilder = mod.DefineType("MyType", TypeAttributes.Public | TypeAttributes.Abstract);
// NOTE: this is Sigil's Emit
var emitter = Emit<MyDelegate>.BuildMethod(typeBuilder, "MyMethod", MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard);
// [...] emit calls
emitter.CreateMethod();
asm.Save(asmName.Name + ".dll");
какой вид выход вы ожидаете? сырые байты? текст? или...? IIRC, Sigil действует как слой поверх «ILGenerator», поэтому, когда он * на самом деле * делает запись - он не является непосредственно ответственным * в любом случае *. Интересно, будет ли 'delegateInstance.Method.GetMethodBody(). GetILAsByteArray()' будет достаточным для того, что вы хотите? –
Текст, я думаю. Я хочу только просмотреть код IL для целей отладки. Я не могу использовать Ildasm (я полагаю), потому что код генерируется во время выполнения. Я понимаю, что Sigil - это всего лишь абстракция, я просто подумал, что я упоминаю об этом, если у нее есть встроенная поддержка для этого. Сейчас я посмотрю на метод GetILAsByteArray. – enzi
Операция 'GetMethodBody' генерирует исключение, по-видимому, этот метод [не работает для DynamicMethods] (http://stackoverflow.com/questions/4146877/how-do-i-get-an-il-bytearray-from- a-dynamicmethod), но спасибо за подсказку. – enzi