IL.View: .NET Reflector OSS Alternative. In Silverlight!


Today I would like to announce a new project I’ve been working on to contribute to the .NET community.

The project is called “IL.View” and it is a .NET Reflector alternative made in Silverlight 4 as an Out-of-Browser Silverlight Application. “IL.View” sources will be published under the MIT (X11) license to the following GitHub repository in the next couple of hours. As soon as Google fixes “If-Modified-Since” bug the online version of “IL.View” will hopefully become immediately available with “Google App Engine”.

image

Background

I’ve started planning this project approximately 2 weeks before infamous Red Gate announcement that “.NET Reflector” goes commercial way and so approximately 2 weeks before an awesome OSS alternative appeared: ILSpy. So “IL.View” background is not an emotional move and is not going to be abandoned with the ILSpy arrival (like Monoflector for instance).

I am a Silverlight developer and my team does a lot of really crazy stuff related to Silverlight, Azure, REST and OData. During the “demo” and “testing” periods we have to deal with publishing a lot – different versions of Windows Servers, various IIS versions, different .NET frameworks at server sides, multiple remote desktops and issue addressing, etc.

One of the issues I’ve experienced in the past (and according to Google I’m not alone with that) is the process of brining .NET Reflector to server side in order to have a quick look at my assemblies. You should be able to download it from somewhere for every server (of course if you have rights to download and install anything), you need to have a proper .NET Framework installed on server side (Reflector itself requires .NET 3.5 or later to be present), etc.

Actually the very same problem may be valid for ILSpy as well. If it is compiled for .NET 4.0 framework you cannot use it at server having .NET 3.x only. So the idea of having a Silverlight version hosted in the company intranet (or in the cloud) was very appealing as it could save time and reduce efforts.

Another feature I was dreaming of is “Remote Assembly Cache” or the possibility to decompile .NET assembly without binding to local machine – even without having any .NET framework installed at all. For example having a remote web service (pure REST, OData, whatever) to resolve .NET dependencies upon being needed. This could open a brand new set of scenarios for me. Having no bindings to local machine could for example allow Mac users to disassemble .NET assemblies easily and drilling down to “mscorlib” or any other part of .NET framework without difficulties (this feature is in progress for “IL.VIew” and will be available later on).

Third major feature I was trying to address is extensibility. NET Reflector always deserved better extensibility support and more complex addins from both code and presentation points of view.

Overview

As I’ve mentioned above “IL.View” is an OOB (Out-of-browser) Silverlight 4 application (Full Trust). It supports drag and drop for .NET assemblies from the desktop or Windows Explorer and provides a local cache of assemblies that were loaded (with the possibility extending the cache manually). “Assembly Browser” control supports “lazy loading” so you get disassembling process on demand. There’s a native “IL” formatting and “C#” one (in progress).

There are several ways “IL.View” can be deployed and used:

  • Online (cloud, web site)
  • On-premise (intranet)
  • Local installation
    Some features that are in progress will allow “IL.View” users to get maximum benefit of both cloud and on-premise deployments.

Mono.Cecil

“IL.View” is not using .NET Reflection. It is being build on the top of Silverlight port of “Mono.Cecil”. This is a tremendous project and I would like to thank Jb Evain for his work. Thanks to Cecil I got an opportunity dealing with both .NET and Silverlight assembly inspection within Silverlight runtime.

Despite the asynchronous nature of Silverlight the Cecil integration went well. “IL.View” provides its own dependency resolution facility that is capable of properly locking the UI and waiting for the user to perform actions:

SNAGHTML103147e

SNAGHTML14fc8c1

ICSharpCode Decompiler and NRefactory for Silverlight

The biggest challenge for me was “C#” output support. Not to reinvent a wheel I’ve decided to stick to ICSharpCode.Decompiler and ICSharpCode.NRefactory projects that are the part of ILSpy.  The only problem I came across is the absence of Silverlight ports for the mentioned projects. So I’ve took the challenge to port them to Silverlight myself. You can find the sources at my GitHub repository. First attempts were quite tricky, but thanks to the ILSpy team the original codebase becomes more and more “portable-friendly”.

As a result I have managed to provide C# output based on ILSpy libraries:

image

JetPack Theme

“IL.View” UI is based on the great “JetPack Theme”. However I had to provide a set of bugfixes for templates and styles in order to make some of the components look properly and behave as expected.

Notes

The project is still in its early stage but is going to evolve rapidly. There’s a huge backlog of features and roadmap will be announced later on. “IL.View” does not compete with ILSpy and I would love to contribute eventually to both .NET Reflector alternatives in the nearest future.

About these ads

10 thoughts on “IL.View: .NET Reflector OSS Alternative. In Silverlight!

  1. Great initiative!

    Wouldn’t be nice if it can support .NET Reflector plugins?
    Alternatively, instead of supporting this in the core, a plugin which adds support for .NET Reflector plugins would be nice.
    Supporting .NET Reflector plugins would make it very popular.

    • Thanks for the feedback. I’m considering to have a set of API parity with ILSpy and reviewing the .NET Reflector addins architecture to simplify the process of addin migration. Also I’m planning to introduce a set of addins myself, something like class diagram, dependency graphs, etc.

  2. hi denis, My heartfelt thanks to you in the first place for the good work you are doing. From a legal standpoint would it be ok if i directly use your code within my projects ? or what. Could you please clarify

    • Acidrain, IL.View is free as soon as its current license is not violated. Meaning you can use the application but not portions of the code within other application. Hope that makes sense.

  3. Is there a way to get the compiled binaries? I have a company laptop which does not have VS2010 and also I cannot compile Silverlight apps in VS2008. I’d use ILSpy but it requires .NET4.0 which I cannot install so IL.View is my only hope.

    • Marek,
      IL.View is a Silvelright application, you will need to host it somewhere (either IIS or Apache). When it is hosted (for instance on some internal company server) you can access IL.View from any machine and use either IN- or OUT-of-browser scenario without installing anything on your laptop. Out-of-browser version is more reach regarding functionality and works offline, so you won’t need to access hosted server untill there’s a new version published. You can get the source code at my Git acount: https://github.com/DenisVuyka/IL.View. Recently I’ve added “.xap” reflection where you can see the contents of Silverlight xap. More features are on the way.
      Denis

  4. I am interested in the out-of-browser version, but in order to use it, I need to compile the source code, right? And as I am not able to compile it on my machine, I was asking if you could provide the compiled version (binaries).

  5. Perfect! That is exactly what I needed. Thanks!

    And if I may have two requests for you:
    1. would you be able to create that kind of package for each build/release (or at least the major ones) and make it available for download?
    2. when the app is disassembling and can’t find a dll it will pop up a window where you can click Browse and find the missing dll. I had like 10 missing dlls and even though all of them were in the same folder I got 10 consecutive pop-us and had to search for all of them. Would it be possible to first search for missing dlls in the last browsed folder (or in all previously browsed folders) and if not found then show the popup? It could be an option in the Settings to turn it on/off if someone would like to choose all the missing dlls by himself/herself.

    Keep up the good work!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s