.NET Reflector 10.0 release notes
Published 15 January 2021
Version 10.0.16.1062 - 4th October, 2018
Fixes
RP-4110:
Copying code now respects formatting options (indentation, number format, digit separators).RP-3952:
Copying code now respects selected optimization level (language version).
Version 10.0.15.1017 - 24th September, 2018
Enhancements
- When appropriate, class name will be skipped when accessing a static method.
Fixes
RP-4128:
Accessing default properties in Visual Basic is now optimized as indexer calls.RP-4129:
Indexers in C# are no longer treated as regular properties with arguments.
Fixes (new engine)
RP-4123:
Calls to ReferenceEquals are no longer decompiled as equality operators. Operators==
and!=
will now only be showed when comparing value types or when comparing reference types with overriden equality operators.RP-4130:
"Unresolved stack state" error was fixed.
Version 10.0.14.983 - 13th September, 2018
Fixes
RP-4119:
Improvements fordecimal
type.RP-4121:
Properties with arguments (Visual Basic’s feature) are now correctly decompiled in C#. Such properties will now be decompiled as separateget_
andset_
methods, because C# doesn’t support those kind of properties.RP-4122:
Some VB 14 features (such as string interpolation) are no longer used when “None” optimization level is selected.
Version 10.0.13.950 - 6th September, 2018
Fixes (new engine)
- Decompilation of ternary conditional operators was improved.
Version 10.0.12.934 - 30th August, 2018
Fixes (new engine)
- Members defined in base classses are now using proper accessors (
base.Member
instead ofthis.Member
). - Indexers for generic types are now properly accessed.
- Decompilation of setters and getters for indexers and properties is now more accurate. Regular properties should no longer be mistaken for indexers.
Version 10.0.11.910 - 23rd August, 2018
Enhancements
RP-4108:
Added an option to disable/enable C# 7.0’s digit separators.- It’s now possible to display numbers as binary literals (C# 7.0).
Fixes
RP-4112:
Tooltip for numeric literals now shows a correct value.
Fixes (new engine)
RP-3454:
Properties with arguments (Visual Basic) are now correctly decompiled as properties, not methods.- Multidimensional array initializers are now properly decompiled.
- Decompilation of
try-catch-finally
was improved. - Other small fixes and improvements to decompilation engine.
Version 10.0.10.881 - 16th August, 2018
Enhancements
RP-4109:
When decompiling code with missing dependencies it’s now possible to Skip all of them, instead of skipping one-by-one.
Fixes (new engine)
- Decimal
0
will now show as0
, notnew decimal()
. - The exception
Operation is not valid due to the current state of the object
should now be fixed. - Arrays of integers are now decompiled correctly (without duplicated entries).
- Other small fixes and improvements to decompilation engine.
Version 10.0.9.857 - 9th August, 2018
Fixes (new engine)
- Lambda expressions are now properly decompiled.
- Decimal numbers are now represented using their short form.
- Filters in
Catch ... When
are now decompiled even ifWhen
contains statements instead of expressions (we attempt to create a valid code when reflecting the meaning of IL code to C# and Visual Basic). - Other small fixes and improvements to decompilation engine.
Version 10.0.8.814 - 2nd August, 2018
Features
With this release we introduced a preview of our new decompilation engine. To use the new version, check the "Preview of a new engine" checkbox on a toolbar.
New engine should generate more accurate code and be more stable. If you have any suggestions, don't hesitate to use the feedback link inside the application. We'd love to hear your thoughts!
Fixes
RP-4092:
Many decompilation errors have been eliminated.RP-4100:
Null-conditional operators are now properly decompiled.RP-4113:
Generic-typed variables are no longer compared tonull
using greater-then or less-then operators.
Version 10.0.7.774 - 24th July, 2018
This release fixes a critical issue where it was possible to execute code by decompiling a .NET object with an embedded resource file. (CVE-2018-14581)
Thanks to Soroush Dalili from NCC Group for bringing this to our attention.
- Minor improvements to .NET Reflector and Visual Studio Add-in
Version 10.0.6.546 - 25th May, 2018
- Telemetry has been updated in accordance with the privacy policy available at https://www.red-gate.com/website/legal.
Fixes
- Fixed issue with incorrectly translating "cgt.un" to just "a > 0" skipping the "unsigned" part of comparison.
- Fixed .NET Reflector VS Extension visibility on the Visual Studio Marketplace.
Version 10.0.5.484 - 10th April, 2018
Features
- Improved support for C# 7 decompilation.
- Added C# 7 decompilation to VsAddin.
Fixes
- Fixed opening circular references in some assemblies.
- Fixed Visual Basic decompilation of C# 7 features.
Version 10.0.4.406 - 15th February, 2018
Fixes
- Fix problem with uploading VS Addin to Visual Studio Gallery
Version 10.0.3.394 - 13th February, 2018
Fixes
- Changes to welcome panel
- Changed link to documentation
Version 10.0.1.374 - 12th February, 2018
Features
.NET Core support
Full C# 7.0 support
Tuples
class TestValueTuples { public (int Key, string Value)[] TestArray; public IEnumerator<(int Key, string Value)> TestInnerType; public (int Key, string Value) TestField; public (int Key, string Value) TestProperty { get; set; } public (int Key, string Value) TestMethod() { throw new NotImplementedException(); } public Func<(int Key, string Value)> TestFunc; public event EventHandler<(int Key, string Value)> TestEvent; public (int Q, int W) Method1((int Key, string Value) arg) { Console.WriteLine(TestField.Value); Console.WriteLine(TestProperty.Value); Console.WriteLine(TestMethod().Value); Console.WriteLine(arg.Value); Console.WriteLine(TestInnerType.Current.Value); Console.WriteLine(TestArray[0].Value); Console.WriteLine(TestFunc().Value); Console.WriteLine(TestFunc.Invoke().Value); TestEvent += (sender, tuple) => { Console.WriteLine(tuple.Value); }; return (8, 16); } }
Out variables
int TestMethod1(Dictionary<string, int> arg, string key) { if (!arg.TryGetValue(key, out var result)) result = 0; return result; }
Pattern Matching
int TestMethod1<T>(IEnumerable<T> arg) { switch (arg) { case IList<T> tmp: return 1; case IEnumerable<int> tmp when tmp.Any(): return tmp.First(); case Queue<T> tmp: return 2; case Stack<T> tmp: return 3; } return 4; } int TestMethod2<T>(IEnumerable<T> arg) { if(arg is List<T> list) return list.Count; return 0; }
Deconstruction
class TestDeconstructors { private int a, b, c; public void Deconstruct(out int a, out int b, out int c) { a = this.a; b = this.b; c = this.c; } public void Method1(TestDeconstructors other) { (a, b, c) = other; } }
Discards
int TestMethod1<T>(IEnumerable<T> arg) { switch (arg) { case IList<T> _: return 1; case IEnumerable<int> tmp when tmp.Any(): return tmp.First(); case Queue<T> _: return 2; case Stack<int> tmp: return tmp.Peek(); } return 4; } int TestMethod2<TKey, TResult>(Dictionary<TKey, TResult> arg) { return arg.TryGetValue(default(TKey), out _) ? 1 : 0; }
Literals
int num = 1_000_000;
Throw Expressions
public static void Method1(IEnumerable<int> asd) { var tmp = (asd as IList<int>) ?? throw new ArgumentNullException(nameof(asd)); }
Local Functions
public int TestMethod1(string a) { int TestLocalFunction1() { return a.Length; } return TestLocalFunction1(); }
Local References
public ref int TestMethod1(ref int a) { a++; return ref a; }
Fixes
RP-4074 — Tooltips for attributes were showing invalid type
- RP-4079 — In some cases decompiling methods containing Guid instance initializer was throwing an exception
- RP-4081 — Order of decompiled fields' and properties' definitions is now preserved