Skip to content

Releases: icsharpcode/ILSpy

ILSpy 8.0

21 May 10:16

Choose a tag to compare

ILSpy 8 is based on .NET 6.0 compared to .NET Framework 4.7.2 for the previous generations of ILSpy. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 6.0.2+ must be installed prior to starting ILSpy.

Note - none of the following lists are exhaustive except of course the first one:

New Language Features

  • C# 10: record structs
  • C# 11: Required members
  • C# 11: ref fields
  • C# 10: Support DefaultInterpolatedStringHandler
  • Output attributes on lambda expressions
  • Updated pattern detection for Roslyn 4.4.0

Contributions

  • More themes - Light/Dark are the original ones, R# & VS Code added (see #2906 and #2931 by @ltrzesniewski)
  • Improve selected text highlighting (see #2938 by @Konctantin)
  • Namespace nesting in ILSpy tree view (based on code provided by @ds5678 in #2667)
  • ilspycmd received support for the "nested directories" option on project export. (see #2636 by @GreyXor)
  • ilspycmd support for generating a solution from multiple projects (based on code provided by @marwie in #2364)
  • Fix the ordering of COM interface methods, properties, and events to appear in their originally defined order (see #2639 by @zhuman)
  • Allow user to provide ID when generating a PDB (see #2678 by @andrewcrawley)
  • Assume conventionally named unresolved method references are properties or events (see #2677 by @fowl2)
  • Add EnableWindowsTargeting propery to csprojs targeting net6.0-windows (see #2752 by @clin1234)
  • Reduce allocations in TransformArrayInitializers (see #2731 by @ElektroKill)
  • Fix crash target framework detection with C++/CLI (see #2698 by @kant2002)
  • Add option to always fully qualify type names with global:: (see #2762 by @hexafluoride)
  • Fix #2736: ILSpy decides to fully qualify type name when it is not necessary (see #2789 by @ElektroKill)
  • Add progress reporting to PortablePdbWriter (see #2802 by @andrewcrawley)
  • Add IEntityProcessor to ReflectionDisassembler (see #2835 by @tom-englert)
  • Fix dynamic type index calculation in ApplyAttributeTypeVisitor (see #2840 by @ElektroKill)
  • Add support for another using pattern (see #2841 by @ElektroKill)
  • Fix debug assertion regarding using directives (see #2843 by @ElektroKill)
  • Add support for VB cached delegate initialization (see #2844 by @ElektroKill)
  • Add support for VB auto events (see #2845 by @ElektroKill)
  • Add support for lock statements within yield return state machines (see #2846 by @ElektroKill)
  • Add support for VB async state-machines (see #2853 by @ElektroKill)
  • Enable various passing ignored tests (see #2852 and #2854 by @ElektroKill)
  • Improve support for post-increment/decrement on pointers (see #2856 by @ElektroKill)
  • Add support for record structs in CSharpAmbience (see #2911 by @ElektroKill)
  • Add support for Visual Basic Yield Return state machine decompilation (see #2874 by @ElektroKill)
  • Fix ResXResourceWriter support for MemoryStream resource element (see #2895 by @ElektroKill)
  • Use .interfaceimpl type syntax (see #2903 by @ltrzesniewski)
  • Fix empty parameter names in delegate declarations (see #2912 by @ElektroKill)
  • Support disassembling ReadyToRun binaries compiled using composite mode (see #2944 by @cshung)
  • Make return duplication in ControlFlowSimplification less aggressive (see #2972 by @ElektroKill)
  • Show a dark title bar when a dark theme in ILSpy is selected (see #2948 by @tom-englert)
  • Consider constructor type when lifting decimal constants (see #2953 by @ElektroKill)
  • Extend EliminateRedundantTryFinally in ReduceNestingTransform (see #2959 by @ElektroKill)

Enhancements

  • Move Settings to ILSpyX (see #2869). Additionally, many platform-independent APIs have been moved to ICSharpCode.ILSpyX since Preview1. ILSpyX is published as a standalone NuGet package for others to reuse.
  • Performance optimization of analyzers (see #2643)
  • Various performance improvements in the type system and decompiler engine. (see #2766 and #2754)
  • #2684: Iteratively unhide compiler-generated code, if it is referenced by user-code
  • Support native ints in "Combine bit.and into shift" transform
  • #2780: Show embedded resource size
  • Use Unsafe.SizeOf when taking the size of a managed type

Bug fixes

Please see the release notes for Preview1 to RC1 for details or, for a full list of changes click here.

ILSpy 8.0 RC 1

14 May 16:08

Choose a tag to compare

ILSpy 8 is based on .NET 6.0 compared to .NET Framework 4.7.2 for the previous generations of ILSpy. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 6.0.2 must be installed prior to starting ILSpy.

Contributions

Enhancements

  • R2R package refreshes

Bug fixes

  • Fix #2956: Prevent loading all ResourceDictionaries eagerly
  • Fix #2945: Do not treat arbitrary method references pointing to members of the current type definition as part of the method. Only do so for compiler-generated methods.
  • Fix #2888: Tuple syntax cannot be used in is-expressions, use underlying type instead.
  • Fix #2921: struct type definition contains duplicate default constructor.

And many other fixes, for a full list click here.

ILSpy 8.0 Preview 4

03 Apr 11:51
29ccf6c

Choose a tag to compare

ILSpy 8 is based on .NET 6.0 compared to .NET Framework 4.7.2 for the previous generations of ILSpy. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 6.0.2 must be installed prior to starting ILSpy.

Contributions

Enhancements

  • Move Settings to ILSpyX (see #2869)
  • Move all code related to single instance logic to separate class (see #2871)

Bug fixes

  • Fix #2933: TwoLetterISOLanguageName is insufficient for loading localized documentation.
  • Fix #2915: inassembly search filter is case sensitive and automatically suggests the wrong term
  • Fix #2922: System.ArgumentOutOfRangeException when decompiling a function

And many other fixes, for a full list click here.

ILSpy 8.0 Preview 3

04 Dec 15:18
1e00940

Choose a tag to compare

ILSpy 8 is based on .NET 6.0 compared to .NET Framework 4.7.2 for the previous generations of ILSpy. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 6.0.2 or newer minor release must be installed prior to starting ILSpy.

IMPORTANT: If you don't have the .NET Desktop Runtime installed, the .NET bootstrapper (a dialog popping up when you try to run ILSpy) will link you to the .NET Runtime which supports only console apps! Please follow the above link and download the Desktop Runtime.

New Language Features

  • C# 11: Required members
  • Updated pattern detection for Roslyn 4.4.0

Contributions

Enhancements

  • Various performance improvements in the type system and decompiler engine. (see #2766 and #2754)
  • Support native ints in "Combine bit.and into shift" transform
  • #2780: Show embedded resource size

Bug fixes

  • Fix #2759: Some characters cause rendering issues in the tree view causing ILSpy to freeze. Also ignore embedded resources with an invalid offset, treat them as having zero byte length.
  • Fix #2763: Improve decompilation of switch-on-enum by preserving enum type information when inlining local variables into SwitchInstruction.Value.
  • PDB generation: Use row ID instead of token in AsyncDebugInfo blob.
  • Fix #2806: Do not use implicitly typed out variables, if argument and parameter types do not match exactly.
  • #2823: Introduce IType.GetDefinitionOrUnknown() to allow better detection of async state-machines involving unknown types.
  • Fix #2825: Missing whitespace after new()
  • Fix #2827: Allow users to enter search queries that match our prefixes.
  • WholeProjectDecompiler: Fix #2830: Can't decompile project with / in resource name on Windows
  • Fix #2831: Popup/Tooltip scaling on multi-monitor multi-DPI setups.
  • WholeProjectDecompiler: Fix #2850: Make sure that type names longer than 255 characters are handled correctly.

And many other fixes, for a full list click here.

ILSpy 8.0 Preview 2

30 Jul 10:16

Choose a tag to compare

ILSpy 8.0 Preview 2 Pre-release
Pre-release

ILSpy 8 is based on .NET 6.0 compared to .NET Framework 4.7.2 for the previous generations of ILSpy. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 6.0 must be installed prior to starting ILSpy.

New Language Features

  • C# 11: ref fields
  • C# 10: record structs
  • C# 10: Support DefaultInterpolatedStringHandler
  • Updated pattern detection for Roslyn 4.3.0
  • Output attributes on lambda expressions

Contributions

  • Allow user to provide ID when generating a PDB (see #2678 by @andrewcrawley)
  • Assume conventionally named unresolved method references are properties or events (see #2677 by @fowl2)
  • Add EnableWindowsTargeting propery to csprojs targeting net6.0-windows (see #2752 by @clin1234)
  • Reduce allocations in TransformArrayInitializers (see #2731 by @ElektroKill)
  • Fix allowed language versions in ilspycmd (see #2703 by @superstrom)
  • Fix crash target framework detection with C++/CLI (see #2698 by @kant2002)

Enhancements

  • #2684: Iteratively unhide compiler-generated code, if it is referenced by user-code
  • Use Unsafe.SizeOf when taking the size of a managed type
  • #2718: Move XAML files that have an x:Class declaration next to their C# counterparts when using WholeProjectDecompiler

Bug fixes

  • #2691: Do not use AssemblyDefintion.GetAssemblyName(). This fails in culture-invariant mode (ilspycmd) when trying to work with satellite assemblies, because System.Reflection.AssemblyName tries to retrieve CultureInfo of the assembly culture
  • #2733: Ignore bad metadata when trying to resolve ResolutionScope
  • #2741: CallBuilder produces invalid invocation target when disambiguating calls to protected methods

And many other fixes, for a full list click here.

ILSpy 8.0 Preview 1

20 Apr 10:14

Choose a tag to compare

ILSpy 8.0 Preview 1 Pre-release
Pre-release

ILSpy 8 is based on .NET 6.0 compared to .NET Framework 4.7.2 for the previous generations of ILSpy. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 6.0 must be installed prior to starting ILSpy. This is true for:

  • the installer
  • the framework-dependent zip
  • the VSIXs

Functionality is supposed to be unchanged and fully functional in this release compared to 7.2. If something works in 7.2 but not 8.0-preview1, please file a bug.

Breaking Changes

  • ILSpy 8.0 will target net60-windows (see #2642) and all plugins will have to be migrated to the new platform.
    • Note: The ICSharpCode.Decompiler engine and NuGet package will continue to target netstandard2.0
  • Platform-independent APIs will be moved to ICSharpCode.ILSpyX, currently that includes (but is not limited to):
    • LoadedAssembly and AssemblyList APIs
    • PdbProvider APIs
  • LoadedAssembly.WaitUntilLoaded() was removed, because it leads to bugs; use await LoadedAssembly.GetLoadResultAsync() instead
  • The MSIX project has been removed and the installer introduced in 7.x will take its place in the Microsoft Store going forward (at RC/RTM).

Contributions

  • ilspycmd received support for the "nested directories" option on project export. (see #2636 by @GreyXor)
  • ilspycmd support for generating a solution from multiple projects (based on code provided by @marwie in #2364)
  • Namespace nesting in ILSpy tree view (based on code provided by @ds5678 in #2667)
  • Fix the ordering of COM interface methods, properties, and events to appear in their originally defined order (see #2639 by @zhuman)

Enhancements

  • Performance optimization of analyzers (see #2643)

Bug fixes

  • #2634: target expressions of delegate references were not decompiled correctly
  • #2632: Make sure that changing the setting "ExpandMemberDefinitions" has an effect when refreshing a decompiled view.
  • #2629: Indentation of method-call chains.
  • #2653: ILSpy reports wrong visibility for overridden protected internal properties if located in another assembly.
  • #2610: Explicitly qualify members in TemplateBindings.
  • #2655: TranslateArrayInitializer crashes with out of order array init

And many other fixes, for a full list click here.

ILSpy 7.2.1

04 Apr 18:32

Choose a tag to compare

Enhancements

  • Improved handling of nullability annotations on types involved in implicit conversions.
  • Improved detection of pinned regions.

Bug fixes

  • #2640: Invalid implicit enum value for unordered items
  • #2646: Missing values for enums with skipped or duplicate items
  • #2664: Fix NRE in ScopeSearchToAssembly.
  • #2637: Add missing Microsoft.Win32.Registry dependency to nuspec.template
  • #2582: Assertion when using named arguments in a constrained call
  • #2654: Ignore custom attributes on parameter where SequenceNumber is out-of-range.
  • See full list of fixes here.

ILSpy 7.2

28 Feb 15:34

Choose a tag to compare

New Language Features

  • C# 7.0 pattern matching
  • C# 8.0 stackalloc in nested contexts
  • C# 9.0 skip locals init
  • C# 9 covariant returns
  • C# 10 file-scoped namespace declarations
  • C# 10 abstract static interface members
  • Updated pattern detection for Roslyn 4.0
  • Updated pattern detection for Mono C# compiler 5.x
  • Updates pattern detection for Roslyn 3.11

Contributions

Enhancements

  • Assembly resolver: GetReferenceAssemblyPath now picks closest available version
  • #1175: Added inassembly: and innamespace: search predicates
  • #2298: Allow to change the DecompilerTextView's font size through scrolling.
  • #2404: Cache decompilation results when switching tabs
  • Better support for voice commands/keyboard navigation
  • Proper support for long paths in Windows 10 in WholeProjectDecompiler.
  • #2608: Support for submenu items
  • Added hyperlinks to metadata explorer tables
  • Add simple public API for XamlDecompiler
  • Improved performance of LoadedAssembly.GetTargetFrameworkId, LoadedAssembly.GetRuntimePackAsync and others
  • #2368: Dim namespaces containing only internal types
  • Improved window menu
  • Added "Copy results" menu item to Analyzer
  • #2550 and #2551: Fix tab and focus handling
  • #2330: Added an option to toggle namespace sub-directory support in project export
  • Added ETW instrumentation to the decompiler for performance measurements
  • Added DecompilerTypeSystem.CreateAsync to allow asynchronous initialization
  • #2522: Support backticks in fully-qualified names when searching for type
  • #2520: The matched pairs are hardly visible in the dark theme
  • Add "Extract package entry" context menu entry for binaries inside bundles/packages
  • IL disassembly: Option to show raw offsets and instruction bytes
  • IL disassembly: Show header sizes

Bug fixes

  • Dirkster99/AvalonDock#324 Navigator window a11y fixes
  • #2579: Use "ILSpyInstance" mutex to wait until the first ILSpy instance is ready to receive WM_COPYDATA
  • #2615: Overflow check did not work reliably due to fp rounding error
  • #2612: Decompilation of newarr with int.MaxValue causes OOME
  • #2622: Fix crash in ExpressionBuilder when decompiling object initializer composed of readonly properties
  • #2533: Various bugfixes in pinned-region detection.
  • #2547 and #2495: Improved decompilation of VB.NET decimal constants.
  • #2544: Do not produce syntax errors with interpolated strings
  • #2545: LINQ does not support null-forgiving operator, suppress transform.
  • #2541: Add explicit unchecked() around non-constant cast of constant to nint
  • #2518: "Other resources" section in resource files was not properly displayed
  • #2534: Handle default implementations of properties and events in interfaces
  • #2458, #2459: Fixed various correctness issues in IL code generated by C++/CLI
  • #2530: Stability fixes in pattern matching detection
  • #2378: Stability fixes in deconstruction detection
  • #2379: This fixes an issue where return statements within try-blocks could turn into goto statements
  • #2052: BAML-to-XAML: Resolve namespaces of properties
  • #1858 and #2188: Improved decompilation of display-classes
  • #2424: Suppress the string==null special-case within the string class itself
  • #2092: aggressively inline code in compiler-generated lambdas and expression trees
  • And many other fixes, for a full list click here

ilspycmd

  • Removed .NET Core 2.1 TFM, added .NET 6.0 TFM

Visual Studio AddIn

ILSpy 7.2 RC

15 Feb 14:37

Choose a tag to compare

Fixes

ILSpy 7.2 Preview 4

07 Feb 06:46

Choose a tag to compare

ILSpy 7.2 Preview 4 Pre-release
Pre-release

Note: ILSpy_binaries_7.2.0.6841-preview4_Fix_zhCN_Start.zip is a quick fix for #2623 - please use when experiencing start crashes on a Chinese system.

New Language Features

  • C# 8.0: stackalloc in nested contexts

Contributions

Enhancements

  • Updated AvalonEdit and other Nuget packages
  • Added hyperlinks to metadata explorer tables
  • Assembly resolver: GetReferenceAssemblyPath now picks closest available version
  • Improved performance of LoadedAssembly.GetTargetFrameworkId, LoadedAssembly.GetRuntimePackAsync and others
  • #2368: Dim namespaces containing only internal types
  • Improved window menu
  • #2608: Support for submenu items
  • Added "Copy results" menu item to Analyzer

Bug fixes

  • #2579: Use "ILSpyInstance" mutex to wait until the first ILSpy instance is ready to receive WM_COPYDATA.
  • #2615: Overflow check did not work reliably due to fp rounding error.
  • #2612: Decompilation of newarr with int.MaxValue causes OOME.
  • #2622: Fix crash in ExpressionBuilder when decompiling object initializer composed of readonly properties.
  • And many other fixes, for a full list click here.