Simple .NET decompiler that turns compiled methods back into LINQ expression trees.
Proof-of-concept utility library that decompiles delegates (Action
, Func<T>
, etc.) into LINQ expression trees (Expression<Action>
, Expression<Func<T>>
, etc.).
interface IFoo
{
IBar Bar { get; }
}
interface IBar
{
string Property { get; set; }
}
// This is the lambda we're going to decompile from IL:
int message = "Hello world.";
Action<IFoo> action = foo => foo.Bar.Property = message;
// Decompile it into an expression tree:
Expression expr = action.Decompile();
// Replace property accessor methods with more semantic property expressions:
expr = new SpecialNameMethodReplacer().Visit(expr);
// Evaluate captured variables to their value:
expr = new PartialEvaluator().Visit(expr);
// Show the result:
Console.WriteLine(expr); // => foo => (foo.Bar.Property = "Hello world!")
Multi-statement methods are not yet supported.
Conditionals, branches, and exception handling are not supported (and probably won’t be).
Currently, this library only targets the full .NET Framework. (Targeting .NET Standard 2.0 should be possible with only a few minor modifications. Earlier .NET Standard versions likely cannot be supported due to missing APIs.)