Skip to content

Releases: icsharpcode/ILSpy

ILSpy 9.0 Preview 3

10 Nov 18:18
Compare
Choose a tag to compare

ILSpy 9.x is based on .NET 8.0. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 8.0 must be installed prior to starting ILSpy.

Breaking Changes in ICSharpCode.Decompiler

  • Remove IsRef, IsOut and IsIn flags from IParameter
  • Replace ParameterModifiers with ReferenceKind.

New Language Features

  • Update pattern detection to Roslyn 4.11.0
  • Support types that provide DisposeAsync without implementing IAsyncDisposable.
  • Add support for C# 12 primary constructors.
  • Add support for C# 12 'ref readonly' parameters

Contributions

Enhancements

  • Allow running tests on ARM64 (see #3231)
  • Alow collecting analyzers annotated with ExportAnalyzerAttribute (see #3239)
  • Fix #3237: Use ref readonly locals for readonly.ldelema
  • Fix #3001: Support new resources format in ResourcesFile/ResXResourceWriter
  • Fix #3134: Include newobj, initobj and call instructions in TypeInstantiatedByAnalyzer
  • Fix #3089: Add comment regarding .constraint prefix expressed as cast in C#

Bug fixes

  • Fix #3209: Ensure using directives are added for extension methods in higher level patterns such as: foreach -> GetEnumerator(), collection initializer -> Add() and deconstruction -> Deconstruct().
  • Fix #3255: Ignore exceptions while decoding sequence point blobs.
  • Fix #2166: Unnecessary uint casts/conversions for certain bitwise operations
  • Fix #3310: Filter out copy-constructor only if it's an actual record type.

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

ILSpy 9.0 Preview 2

09 Jun 17:35
Compare
Choose a tag to compare

ILSpy 9.x is based on .NET 8.0. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 8.0 or later must be installed prior to starting ILSpy.

Breaking Changes

  • @file support with breaking changes to command line options #3205
  • New single instance handling #3212

Enhancements

  • Replace native interop CommandLineToArgvW with parsing in Process.Unix.cs from System.Diagnostics.Process #3201
  • Natural Sort without interop #3196
  • AOT and x-plat changes #3203

Bug fixes

  • Fix #3197: Bug when trying to read a bundle/archive file
  • Fix #3189: Support primitive types in Expression.Constant(object) pattern in Expression Trees

ILSpy 9.0 Preview 1

01 Apr 16:31
Compare
Choose a tag to compare

ILSpy 9.x is based on .NET 8.0. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 8.0 or later must be installed prior to starting ILSpy.

Breaking Changes

  • ICSharpCode.Decompiler: Added MetadataFile base class for PEFile
  • ICSharpCode.Decompiler: IModule.PEFile is now named IModule.MetadataFile
  • ICSharpCode.Decompiler/ILSpyX: Added IFileLoader API to allow for easier extensibility of supported file formats (see #3191)
  • ILSpy: Split BAML decompiler into library and add-in (see #3178)
  • ILSpy/ILSpyX: Moved non-UI analyzer API to ILSpyX (see #3186)
  • ICSharpCode.Decompiler: IProjectFileWriter and IProjectInfoProvider APIs are now public (see #3151 and #3191)

Performance

  • Activate Dynamic Adaptation To Application Sizes (DATAS) (#3122).
  • RDP hardware acceleration (#3122): Enabling hardware acceleration for Remote Desktop Protocol (RDP) to boost performance.

New Language Features

  • Update pattern-detection to Roslyn v4.9.2
  • Added support for switch on (ReadOnly)Span<char> using a compiler-generated hash function.
  • Added new a.GetValueOrDefault(b) -> a ?? b transform for side-effect-free default values.

Enhancements

  • Added support for reading standalone ECMA-335 metadata (portable PDB and other metadata blobs) (see #3149)
  • Added support for reading WebCIL assemblies (IL embedded in WASM) (see #3184)
  • #3118: Add "Clear assembly list" menu item.
  • #2893: Add option to disable automatic assembly loading.
  • IL output: Add indentation level to make it easier to see custom attributes belonging to interface implementations.
  • IL output: Print metadata token of custom attribute.

Contributions

  • Fix metadata display of DynamicLocalVariable and DefaultNamespace custom debug information (#3111, @ElektroKill)
  • Read and use tuple element names and dynamic type information from PDBs (#3114, @ElektroKill)
  • Adjust colors of AvalonEdit built-in highlightings for dark themes (#3138, @ltrzesniewski)
  • Bugfix: infinite loop in DetermineEffectiveAccessibility (#3164, @yzdeveloper)
  • TreeView: Add referenced types, members and exported types under references (#3092, @fowl2)
  • Add support for Mono C# compiler 2.6.4 pinned region with array variable (#3110, @ElektroKill)

Bug fixes

  • Fix #3072: Ignoring resources with the same name as a namespace.
  • Fix bug in UnknownType: Ensuring that the FullName of nested unknown types contains the outer type name(s), not just the namespace and nested type name.
  • Fix #3153: Always using SHA1 for public key tokens.
  • Fix ILSpy for ZIP files/VSIX with bundle signatures: Enabling ILSpy to open ZIP files and VSIX packages containing bundle signatures.
  • Omit package entries from the treeview that denote the directory.
  • Fix #3142: Exception when analyzing source of library with global assembly attributes
  • Fix #3113: Remove GetAlternativeName and instead reuse existing names, if there are no conflicts.

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

ILSpy 8.2

06 Nov 17:06
Compare
Choose a tag to compare

ILSpy 8.x is based on .NET 6.0. All artifacts except the self-contained distribution are built framework-dependent, which means .NET 6.0.2 or later must be installed prior to starting ILSpy.

New Language Features

  • C# 7.1 Pattern matching with generics
  • C# 8.0 Recursive patterns
  • C# 9.0 Relational patterns
  • C# 9.0 not patterns
  • C# 10.0 static abstract members in interfaces
  • C# 11.0 switch on (ReadOnly)Span<char>

Contributions

Enhancements

  • #3090: add support for the NUGET_PACKAGES environment variable
  • Fixed some quirks in our search: #3064, #3065 and #3038

Performance

  • #3075: Avoid processing already-transformed blocks by introducing BlockTransformContext.IndexOfFirstAlreadyTransformedInstruction, which allows us to track already transformed instructions after a block has been merged into another by ConditionDetection.
  • #3075: Add NextSetBit operation to BitSet to avoid looking at every store bit individually in ReachingDefinitionsVisitor.GetStores()
  • #3075: Fix ILVariableEqualityComparer.GetHashCode
  • #3075: Improve performance of CSharpResolver.LookupSimpleNameOrTypeName in cases with a large number of local variables.
  • #3075: Eliminate recursion in some parts of the decompiler engine
  • ILSpy UI: #3057 - sub-optimal use of StringBuilder when constructing tree-node labels

Bug fixes

  • #3061: Handler blocks of exception filter blocks do not have a header.
  • #3103: unaligned.stobj cannot be transformed into inline assignment
  • #3091: extension methods named Add were skipping some checks in AccessPathElement.IsMethodApplicable.
  • #3004: MetadataModule.ResolveEntity() returning null for System.IntPtr when C# 11 native integers are enabled.
  • #3105 - VS2017-2019 addin didn't properly match subdirectory structure of 2022 addin
  • #3014: Missing type information in lambda expressions

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

ILSpy 8.1.1

16 Sep 17:38
Compare
Choose a tag to compare

Release notes for 8.1 apply https://github.com/icsharpcode/ILSpy/releases/tag/v8.1 as this release is a bugfix release only.

Fixed bug #3069 in switch-on-string detection, where complex switches compiled with newer versions of the C# compiler would cause a crash. Other minor fixes included too.

For details please see v8.1...v8.1.1

ILSpy 8.1

03 Aug 07:10
Compare
Choose a tag to compare

ILSpy 8.x 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.

New Language Features

  • C# 11 checked operators
  • C# 11 unsigned right shift operator
  • C# 11 UTF8 string literals
  • C# 11 numeric IntPtr
  • C# 11 ref fields and scoped
  • mcs 2.6.4 pinned regions
  • Updated pattern-detection for Roslyn 4.6.0

Contributions

Enhancements

  • Default update check for dotnet tool ilspycmd (#3035). Use --disable-updatecheck in automation scenarios.
  • VS 2022 extension ships with both x64 and ARM64 binaries (#3009)
  • Added ARM64 binaries and ARM64 installer downloads
  • WholeProjectDecompiler: Improve resources -> resx conversion
  • Improve decompilation of compound-assignments involving local variables
  • Refactor ILReader to support re-imports of basic blocks (#901)

Bug fixes

  • #2891: Populate framework_dirs with the correct values depending on the current host runtime.

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

ILSpy 8.0

21 May 10:16
Compare
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
Compare
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
Compare
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
Compare
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.