Hi, The Mono.CompilerServices stuff is from Mono, not from Cecil, we're simply using that to read symbols. You can ask on the mono lists if you have any question about how it works.
On the Cecil side of things, we're abstracting things away, you can read: https://github.com/jbevain/cecil/wiki/Debug-symbols This way we don't really expose anything specific to mdb or pdb. Also note that not all instructions have sequence points. Jb On Thu, May 1, 2014 at 10:37 AM, Tony Zadravec <[email protected]> wrote: > Apologies for spamming this site. I finally managed to get the info out of > Cecil that I was after. > > The follow code can be used to iterate through all classes and methods and > dump out their Source File location. > > My issue was loading the symbols. Other posts indicated that once the > assembly definition was loaded, all I had to do was call > asm.MainModule.ReadSymbols() > > However, this caused errors for me. > > I had to load the symbol file separately and then use this to load the > symbols for the MainModule, as follows: > > MonoSymbolFile symFile = > MonoSymbolFile.ReadSymbolFile(monoAssembly + ".mdb"); > ISymbolReader sr = (ISymbolReader)(new > Mono.Cecil.Mdb.MdbReader(asm.MainModule, symFile)); > asm.MainModule.ReadSymbols(sr); > > Hopefully the code below will save someone else time mucking around. > > I still have an outstanding question I am hoping someone can answer for me. > > I would like to use the MonoSymbolFile.Methods, a MethodEntry list. > MethodEntry has the source file. Where it fails for me, is that GetRealName > often returns a null. How can I retrieve the source file location for a > MethodEntry? > > > > ======================================================== > > > using System; > using System.Collections.Generic; > using System.Text; > using Mono.Cecil; > using Mono.Cecil.Metadata; > using Mono.Cecil.Mdb; > using Mono.Cecil.Cil; > using Mono.CompilerServices.SymbolWriter; > using System.Diagnostics; > > namespace TestCecil > { > public class Program > { > > > public static void DumpAssembly(string monoAssembly) > { > > // Loads the assembly from the start arguments > var readerParameters = new ReaderParameters { ReadSymbols = true > }; > AssemblyDefinition asm = > AssemblyDefinition.ReadAssembly(monoAssembly, readerParameters); > > // Load Symbols > MonoSymbolFile symFile = > MonoSymbolFile.ReadSymbolFile(monoAssembly + ".mdb"); > ISymbolReader sr = (ISymbolReader)(new > Mono.Cecil.Mdb.MdbReader(asm.MainModule, symFile)); > asm.MainModule.ReadSymbols(sr); > > // Iterates through the assembly's modules, aspects of the > program > foreach (ModuleDefinition mod in asm.Modules) > { > MonoSymbolFile msf = MonoSymbolFile.ReadSymbolFile(mod); > > Log(mod.Name); > // Iterates through the classes of the assembly > foreach (TypeDefinition td in mod.Types) > { > // Writes the types name, > DoType(td); > } > } > } > > static void DoType(TypeDefinition td) > { > foundModule = false; > { > foundModule = true; > foreach (TypeDefinition ntd in td.NestedTypes) > { > // Repeat if the class has nested classes. > DoType(ntd); > } > foreach (MethodDefinition md in td.Methods) > { > // Log the content to the console > Log(td.Name + " > " + md.Name); > > foreach (var l in md.Body.Instructions) > { > if (l.SequencePoint != null) > { > if (l.SequencePoint.Document != null) > { > if (l.SequencePoint.Document.Url != > null) > { > > Debug.WriteLine(l.SequencePoint.Document.Url); > break; > } > } > } > } > > > } > } > } > > } > } > > -- > -- > -- > mono-cecil > --- > You received this message because you are subscribed to the Google Groups > "mono-cecil" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. -- -- -- mono-cecil --- You received this message because you are subscribed to the Google Groups "mono-cecil" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
