2015-03-13 16 views
1

Я использую 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"); 
+0

какой вид выход вы ожидаете? сырые байты? текст? или...? IIRC, Sigil действует как слой поверх «ILGenerator», поэтому, когда он * на самом деле * делает запись - он не является непосредственно ответственным * в любом случае *. Интересно, будет ли 'delegateInstance.Method.GetMethodBody(). GetILAsByteArray()' будет достаточным для того, что вы хотите? –

+0

Текст, я думаю. Я хочу только просмотреть код IL для целей отладки. Я не могу использовать Ildasm (я полагаю), потому что код генерируется во время выполнения. Я понимаю, что Sigil - это всего лишь абстракция, я просто подумал, что я упоминаю об этом, если у нее есть встроенная поддержка для этого. Сейчас я посмотрю на метод GetILAsByteArray. – enzi

+0

Операция 'GetMethodBody' генерирует исключение, по-видимому, этот метод [не работает для DynamicMethods] (http://stackoverflow.com/questions/4146877/how-do-i-get-an-il-bytearray-from- a-dynamicmethod), но спасибо за подсказку. – enzi

ответ

1

Я думаю, что самый простой способ будет на самом деле создать сборку, содержащую ваш метод, а затем использовать ILDASM на этом. Таким образом, вы можете сохранить большую часть своего кода и заменить только какую-то сантехнику (возможно, заменяя Emit<T>.NewDynamicMethod() на Emit<T>.BuildMethod()).

+0

Это не самое удобное решение, потому что, как вы говорите, необходимы некоторые изменения кода, но он работает. Я закончил создание модульного теста, который записывает сборку на диск (чтобы я мог легко воссоздать ее во время разработки) и скопировал код Emit. – enzi