@christophwille christophwille released this Jan 16, 2019 · 127 commits to master since this release

We want to thank all contributors who provided fixes (details see below)! And we want to thank all testers, who provided feedback and tested very thoroughly!

New Language Features

  • C# 1.0/2.0 overloaded &&/|| operators
  • C# 4.0 optional arguments
  • C# 7.1 reference assemblies: ILSpy will show a warning if you are looking at a reference assembly
  • C# 7.2 non-trailing named arguments
  • C# 7.2 stackalloc with Span
  • C# 7.3 stackalloc initializers

Improved Pattern Detection

  • Decompilation and pretty-printing of float literals (#517 -> #1350)
  • Object and array initializer improvements
  • Various smaller improvements in correctness and prettiness of the decompiled code.
  • Decompilation of integer literals (#1322)
  • Variable splitting works better with method calls (#1253)
  • Expression Trees: Multiple levels of nesting are now supported better
  • C# 6.0 string interpolation with FormattableString/IFormattable


Decompilation engine

  • Chicken-Bones: Improved block ordering in ConditionDetection (#1218)
  • Chicken-Bones: Improved switch and loop detection (#1258, #1295 and #1296)
  • ashmind: Decimal constant improvements (#1236)
  • Viridovics: Add cast to object for reference types in ExpressionBuilder.VisitUnboxAny (#1277)
  • vizv: Fix yield return for assembly compiled with Mono (#1303)
  • cshung: Bug fix for #1224 (#1243)


  • ninjaoxygen: Update UniversalAssemblyResolver to include missing .NET 3.x [Compact Framework] support (#1347)
  • wangzq: Add command line argument "/config:" to specify settings file (#1360)
  • kmatyaszek: Add show IL code to ICSharpCode.Decompiler.Console (#1285)
  • agametov: CWE-252 The return value of function 'Reverse' is required to be utilized. (#1305)
  • siriak: Code cleanup (#1363)

Improvements & Bugfixes

  • Added option to display all members, including compiler-generated members and getters/setters in tree view. (#747)
  • Added option to display metadata token in 10-based or hex format. (#628)
  • Reorganized option pages. (#1130)
  • Local functions: Code is no longer hidden if local functions are used in the code, as long as they're not decompled correctly. Note that this might still lead to compile errors, if anonymous types or lambdas are used in the local functions.
  • Decompilation of invalid IL
  • Improved decompilation of C++/CLI constructs
  • Improved stability of analyzers
  • Various smaller bugfixes


  • CreateCecilObjectModel: extension method to help plugin writers porting their plugins to ILSpy 4.0
  • IAmbience API revived: If you want to nicely print type names or member signatures in C# style, you can now use CSharpAmbience
  • "Open containing folder" and "Open command line here" added to Assembly tree nodes.
  • Experimental PDBgen (no lambda support, no yield/async state machines; very basic C#)
  • New IAnalyzer API
  • Added IDocumentationProvider: allows providing XML doc comments from custom sources
  • Added IDebugInfoProvider: allows providing debug info (variable names and sequence points)

Architectural Changes

For ILSpy 4 we replaced Mono.Cecil with System.Reflection.Metadata. The wiki entry on SRM deals at length with information that is important to addin writers, the background story and some of the performance/memory improvements you as a user of ILSpy can expect.

Our goal for this version given the underlying architectual changes is as follows: "As good or better as ILSpy 3.2 in terms of decompilation quality, stability, performance and memory usage."

Assets 5