有没有办法查看 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()
)。
我正在使用 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()
)。