Click here to Skip to main content
Licence CPOL
First Posted 6 Aug 2007
Views 28,296
Downloads 713
Bookmarked 37 times

Diagrams with Reflector and the Graph Plugin (Part 1)

By | 6 Aug 2007 | Article
Updating the Graph Plugin to provide a diagram of method dependencies within a class.
Screenshot - method_dependencies.gif

Introduction

Recently a friend banged me over the head with Reflector, I had a play, and discovered the wonderful "Graph Plugin", which draws pictures of software. It didn't quite draw the pictures I wanted, so I've added one, and written this article about how easy it was.

The picture I wanted was methods within a class showing which method called which others. For most classes, this is minimal, but for some classes, especially complex UI classes, a diagram like this can be very useful.

This is Reflector, the MSIL dissassembler, by Lutz Roeder, and this is the Graph Plugin, with the instruction call graph, by Jonathan de Halleux. Reflector is obfuscated, sadly, but the source code is available for the Graph Plugin. It uses QuickGraph and GLEE, which I've included in the download, along with Reflector.

QuickGraph is the underlying graph structure, and Glee provides the viewer control and layered layout engine. The combination works well, in that generally a readable diagram is presented.

Finding Method Calls

When Reflector activates our plugin for a class activeType, thanks to Reflector, we can run over the methods very simply like this :

    foreach (IMethodDeclaration method in activeType.Methods)
    {
    }

For each method above, thanks to the Graph Plugin, we can now run over the instructions in the method, also very simply like this :

    InstructionGraph igraph = new InstructionGraph(method);
    foreach (IInstruction i in igraph.Body.Instructions)
    {
    }

We can also then pick out the "call" instructions that we're interested in like this :

    FlowToCodeConverter flowConverter = new FlowToCodeConverter();
    ...
    if (flowConverter.Convert(i.Code) !=
        System.Reflection.Emit.FlowControl.Call) continue;

This is the basic mechanism that this modified plugin will use to locate method dependencies. We run over the list of methods in the class twice. Once to see which methods we have defined in the class, and a second time to see which methods call which others. Things are complicated by overloaded methods, which have to be tracked individually, and by property get set methods, which can be shown or hidden.

Background

Note that the code included here is not mine, but belongs to Jonathan de Halleux. All we're doing here is adding another control and using the IL call graph / visitor code he's built. I've also taken the liberty of modifying the selection for the original diagrams to click-select, rather than mouse over select.

There are some issues which would be nice to sort out with the Glee viewer control, which I haven't looked into yet:

  • Zoom seems a little awkward, right click to "go back" might help.
  • I haven't worked out how to adjust node position manually.
  • Placement of disconnected nodes seems a little random.
  • Only worked out how to affect the layout using AspectRatio.

Using the Code

You should be able to run reflector from the extracted bin folder, or take the Reflector.Graph.dll and put it in your Reflector folder, if you have it installed already. When you run Reflector, you may have to View|Addins|Add Reflector.Graph.dll before you'll see the extra right click menu options.

When you're on a class, you should have the right click menu for Method Dependencies, which will open the new control for the selected class. Selecting methods in the diagram should focus the method in the main tree control.

If you're interested, the code is mostly 3 methods in HuffsMethodDeps.cs, which are all commented line by line so you can see what's happening.

Points of Interest

Updating the plugin was surprisingly easy. We pretty much create a control, inform the plugin mechanism, and let it know what sort of item we want it to be available for :

    UserControl huffsMethodDeps = new HuffsMethodDeps(serviceProvider);
    ...
    this.windowManager.Windows.Add("Graph.HuffsMethodDeps", 
        huffsMethodDeps, "Huffs Internal Functional Dependencies");
    ...
    this.AddCommand("Browser.TypeDeclaration", "Huffs Internal Functional Dependencies", 
        new EventHandler(this.HuffsMethodDeps_Click));

After that, we just add the button click and we're away.

    private void HuffsMethodDeps_Click(object sender, EventArgs e)
    {
        this.windowManager.Windows["Graph.HuffsMethodDeps"].Visible = true;
    }

History

  • 06/08/2007 - Article created

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

hughd

Web Developer

United Kingdom United Kingdom

Member

hughdoar@hotmail.com

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralDoesn't work with the latest .Net Reflector Pinmembertorial9:50 13 Feb '09  
GeneralRe: Doesn't work with the latest .Net Reflector Pinmemberhughd1:53 23 Feb '09  
GeneralRe: Doesn't work with the latest .Net Reflector PinmemberTom Bushell10:49 9 Jun '09  
GeneralOutstanding PinmemberShane Triem11:14 21 Aug '07  
GeneralRe: Outstanding Pinmemberhughd12:17 24 Feb '09  
General.You need to do something PinmemberSacha Barber22:02 6 Aug '07  
GeneralRe: .You need to do something Pinmemberh_d752:15 7 Aug '07  
GeneralRe: .You need to do something PinmemberSacha Barber5:01 7 Aug '07  
GeneralRe: .You need to do something Pinmemberhughd8:39 7 Aug '07  
GeneralRe: .You need to do something PinmemberSacha Barber9:28 7 Aug '07  
GeneralRe: .You need to do something Pinmemberhughd11:36 7 Aug '07  
GeneralRe: .You need to do something PinmemberSacha Barber1:49 8 Aug '07  
GeneralGreat addition Pinmembersumanr19:27 6 Aug '07  
GeneralRe: Great addition Pinmemberh_d752:17 7 Aug '07  
GeneralRe: Great addition Pinmembersumanr13:42 7 Aug '07  
GeneralRe: Great addition Pinmemberhughd8:43 9 Aug '07  
GeneralRe: Great addition Pinmemberhughd12:16 24 Feb '09  
GeneralExcellent... PinmemberAnandChavali19:11 6 Aug '07  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120517.1 | Last Updated 6 Aug 2007
Article Copyright 2007 by hughd
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid