C# 有没有办法查看动态方法生成的IL代码(在Sigil中)?

C# 有没有办法查看动态方法生成的IL代码(在Sigil中)?,c#,il,emit,dynamicmethod,ilgenerator,C#,Il,Emit,Dynamicmethod,Ilgenerator,我正在使用创建一个DynamicMethod,希望看到生成的IL 我以前从未使用过DynamicMethods,因此可能有一个非常明显的答案,但到目前为止,我还没有发现任何东西 这里有一个,但它很旧,我不知道链接工具在VS2013中是否有效——我想可能有更新的工具可用。 将生成的方法存储在程序集中并将其写入磁盘可能是可行的,但这在开发过程中相当麻烦 顺便说一下,我知道Sigil的CreateDelegate方法的out string指令参数,但这似乎不是“真实的”IL代码(包含例如命名标签),我

我正在使用创建一个
DynamicMethod
,希望看到生成的IL

我以前从未使用过
DynamicMethods
,因此可能有一个非常明显的答案,但到目前为止,我还没有发现任何东西

这里有一个,但它很旧,我不知道链接工具在VS2013中是否有效——我想可能有更新的工具可用。 将生成的方法存储在程序集中并将其写入磁盘可能是可行的,但这在开发过程中相当麻烦

顺便说一下,我知道Sigil的
CreateDelegate
方法的
out string指令
参数,但这似乎不是“真实的”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");
var asmName=newassemblyname(“MyAssembly”);
var asm=AppDomain.CurrentDomain.DefinedDynamicAssembly(asmName,AssemblyBuilderAccess.Save);
var mod=asm.definedDynamicModule(asmName.Name,asmName.Name+“.dll”);
var typeBuilder=mod.DefineType(“MyType”,TypeAttributes.Public | TypeAttributes.Abstract);
//注意:这是Sigil的发射
var emitter=Emit.BuildMethod(typeBuilder,“MyMethod”,MethodAttributes.Static | MethodAttributes.Public,CallingConventions.Standard);
//[…]发出呼叫
CreateMethod();
asm.Save(asmName.Name+“.dll”);

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

您希望得到哪种输出?原始字节?文本?或IIRC,Sigil充当
ILGenerator
顶部的一层,因此当它实际执行写操作时,它并不直接负责。我想知道
delegateInstance.Method.GetMethodBody().GetILAsByteArray()
是否足以满足您的需要?我猜是文本。我只希望查看IL代码以进行调试。我不能使用Ildasm(我想),因为代码是在运行时生成的。我意识到Sigil只是一个抽象,我只是想我提到它,以防它也有内置的支持。现在我来看看
GetILAsByteArray
方法。
GetMethodBody
操作抛出一个异常,显然是这个方法,但感谢您的提示。这不是最方便的解决方案,因为正如您所说,一些代码更改是必要的,但它是有效的。我最终创建了一个单元测试,将程序集写入磁盘(这样我可以在开发过程中轻松地重新创建它),并复制粘贴的Emit代码。