Daniel Grunwald edited this page Dec 3, 2016 · 4 revisions

The newdecompiler branch of ILSpy is a re-design of the underlying decompiler engine (ICSharpCode.Decompiler). The main objective of this redesign is to fix architectural deficits that cause the decompiler to generate incorrect code.

Examples of issues fixed by the new architecture:

  • Invalid goto jumping into block
  • Decompiled code calls incorrect overload due to missing cast
  • Integer arithmetic uses wrong sign or size due to missing casts

The major changes in the new decompiler are:

  • ILAst instructions now carry an IL stack type (enum StackType), so the bit width of operations is known.
  • ILAst instructions no longer use C# types; those are introduced only when converting ILAst->C#.
  • ILAst instruction set is reduced and now has clear semantics for each operation.
  • ILAst uses (extended) basic blocks for control flow.
  • Many transforms now are run per-block, which solves a number of problems related to transform pass ordering.
  • In debug builds, transform steps can be tracked via the Stepper API to visualize the decompilation process.
  • Instead of Cecil.TypeReference, the decompiler now uses the NRefactory TypeSystem.
  • The required portions of ICSharpCode.NRefactory are included into ICSharpCode.Decompiler.


  1. ILSpy should be able to decompile itself, and still work when re-compiled from the decompiled code. (= correctness)
  2. Add back async/await decompilation, and other transform the old ILSpy that are not yet ported to the new decompiler. (= make decompiled code more pretty by using higher-level constructs)
  3. Add support for new code patterns used by the Roslyn C# compiler.
  4. Add support for C# 6 and 7 language features.
  5. Optimize the decompiler.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.