Skip to content

Instantly share code, notes, and snippets.

@kflu
Last active November 28, 2018 14:49
Show Gist options
  • Save kflu/d4f30f058678ccc700a7 to your computer and use it in GitHub Desktop.
Save kflu/d4f30f058678ccc700a7 to your computer and use it in GitHub Desktop.
Dump expression tree lambda into assembly for easy IL inspection using ildasm
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Linq.Expressions;
using System.Reflection.Emit;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
public Program program;
static void Main(string[] args)
{
var obj = Expression.Parameter(typeof(object), "instance");
var typedObj = Expression.Convert(obj, typeof(Program));
var getter = Expression.PropertyOrField(typedObj, "program");
var upcasted = Expression.Convert(getter, typeof(object));
var lam = Expression.Lambda<Func<object, object>>(upcasted, obj);
var func = lam.Compile();
Console.WriteLine(lam.ToString());
SaveExpressionTreeToAssembly(lam, "get", "this", "this.dll");
}
public static void SaveExpressionTreeToAssembly(LambdaExpression lambda, string methodName, string assemblyName, string assemblyPath)
{
var dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(assemblyName), AssemblyBuilderAccess.Save);
var dynamicModule = dynamicAssembly.DefineDynamicModule(assemblyName + "_module", assemblyName + ".dll");
var dynamicType = dynamicModule.DefineType(assemblyName + "_type");
lambda.CompileToMethod(dynamicType.DefineMethod(methodName, MethodAttributes.Public | MethodAttributes.Static));
dynamicType.CreateType();
dynamicAssembly.Save(assemblyPath);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment