コンパイルされた式から生成されたILコードの表示
-
16-10-2019 - |
質問
式ツリーでコンパイル()を呼び出すときに生成されたILコードを表示することは可能ですか?この非常に簡単な例を考えてみましょう:
class Program
{
public int Value { get; set; }
static void Main(string[] args)
{
var param = Expression.Parameter(typeof(Program));
var con = Expression.Constant(5);
var prop = Expression.Property(param, typeof(Program).GetProperty("Value"));
var assign = Expression.Assign(prop, con);
Action<Program> lambda = Expression.Lambda<Action<Program>>(assign, param).Compile();
Program p = new Program();
lambda(p);
//p.Value = 5;
}
}
さて、式ツリーは最後の行を実行します Main
言う。アプリケーションをコンパイルしてから、リフレクターで開きます。のILコードを見ることができます p.Value = 5;
それは割り当てを行います。しかし、式ツリーは実行時に作成され、編集されました。コンパイルから結果のILコードを表示することは可能ですか?
解決
はい!このツールを使用してください:
https://github.com/drewnoakes/il-visualizer
これは、コンパイルを実装してデバッグしていたときに非常に便利でした。想像できると確信しています。
他のヒント
DynamicAssemblyを作成し、次にDynamicModule、dynamictype、およびdynamicMethodを作成します。その方法を公開して静的にし、それをlambdaのメソッドcompileto()に渡します。アセンブリフラグを作成するときは、保存してください。次に、save()メソッドを呼び出し、パスを渡します。ディスクに書き込まれます。リフレクターで開いてポップします。
何かのようなもの:
var da = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("dyn"), // call it whatever you want
AssemblyBuilderAccess.Save);
var dm = da.DefineDynamicModule("dyn_mod", "dyn.dll");
var dt = dm.DefineType("dyn_type");
var method = dt.DefineMethod(
"Foo",
MethodAttributes.Public | MethodAttributes.Static);
lambda.CompileToMethod(method);
dt.CreateType();
da.Save("dyn.dll");
所属していません StackOverflow