1

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

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

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

顺便说一句,我知道out string instructionsSigilCreateDelegate方法的参数,但这似乎不是“真正的”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");
4

1 回答 1

1

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

于 2015-03-13T20:16:37.743 回答