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

Is there a way to view the generated IL code of a DynamicMethod (in Sigil)?

我正在使用 Sigil 创建一个 DynamicMethod 并希望查看生成的 IL。

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

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

顺便说一下,我知道 Sigil 的 CreateDelegate 方法的 out string instructions 参数,但这似乎不是 "real" 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");

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