.NET Reflector 11

.NET Reflector 10.0 release notes

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 for decimal type.
  • RP-4121: Properties with arguments (Visual Basic’s feature) are now correctly decompiled in C#. Such properties will now be decompiled as separate get_ and set_ 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 of this.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 as 0, not new 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 if When 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 to null 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

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




Didn't find what you were looking for?