public void Disassemble(MethodBody body) { // start writing IL code var method = body.Method; var codesize = body.ComputeCodeSize(); var maxstacksize = body.ComputeMaxStackSize(); body.ComputeOffsets(); _o.WriteLine("// Code size {0} (0x{0:x})", codesize); _o.WriteLine(".maxstack {0}", maxstacksize); if (method.DeclaringType.Module.Assembly != null && method.DeclaringType.Module.Assembly.EntryPoint == method) { _o.WriteLine(".entrypoint"); } if (method.Body.HasVariables) { _o.Write(".locals "); if (body.InitLocals) { _o.Write("init "); } _o.WriteLine("("); _o.Indent(); foreach (var v in body.Variables) { _o.Write("[" + v.Index + "] "); v.VariableType.WriteTo(_o); if (!string.IsNullOrEmpty(v.Name)) { _o.Write(' '); _o.Write(DisassemblerHelpers.Escape(v.Name)); } if (v.Index + 1 < body.Variables.Count) { _o.Write(','); } _o.WriteLine(); } _o.Unindent(); _o.WriteLine(")"); } _o.WriteLine(); if (body.Instructions.Count > 0) { var inst = body.Instructions[0]; var branchTargets = GetBranchTargets(body.Instructions); WriteStructureBody(new IlStructure(body, codesize), branchTargets, ref inst); } else { // we ignore method without instructions (but it can have exception handlers) _o.WriteLine(); } }