有没有办法查看生成的DynamicMethod的IL代码(在Sigil中)?

时间:2015-03-13 17:00:35

标签: c# il emit dynamicmethod ilgenerator

我使用Sigil创建DynamicMethod,并希望看到生成的IL。

我之前从未与DynamicMethods合作过,所以也许这是一个非常明显的答案,但到目前为止我还没有找到任何答案。

这里是similar question,但它已经很老了,我不知道链接工具是否在VS2013中有效 - 我想也许有更新的东西可用。 将生成的方法存储在程序集中并将其写入磁盘可能有效,但在开发过程中这非常麻烦。

顺便说一下,我知道Sigil out string instructions方法的CreateDelegate参数,但这似乎并不是真正的"真实的&#34 ; IL代码(包含例如命名标签),我也不确定这是在Sigil优化之前还是之后。

编辑:我最终创建了一个动态程序集并将其写入磁盘,正如@svick建议的那样。然后可以使用ildasm查看发射方法的IL。如果有人想要这样做,请参阅我使用的代码:

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");

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是实际创建一个包含你的方法的程序集,然后使用ildasm。这样,您可以保留大部分代码,只替换一些管道(可能会将Emit<T>.NewDynamicMethod()替换为Emit<T>.BuildMethod())。