ちょっとした目新しさとして、実行時に生成された軽量コードとVSコンパイラによって生成されたコードとのILの外観がどのように異なるかを確認しようとしています。これは、VSコードが次のような異なるパフォーマンスプロファイルで実行される傾向があることに気付いたためです。キャスト。
だから私は次のコードを書きました::
Func<object,string> vs = x=>(string)x;
Expression<Func<object,string>> exp = x=>(string)x;
var compiled = exp.Compile();
Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
残念ながら、GetMethodBodyは明らかに式ツリーによって生成されたコードに対する不正な操作であるため、これは例外をスローします。ライブラリ方式で(つまり、ツールにAPIがない限り、外部ツールを使用しないで)軽量codegenを使用してコードによって生成されたコードを確認するにはどうすればよいですか?
編集:エラーは5行目で発生します。compiled.Method.GetMethodBody()は例外をスローします。
Edit2:メソッドで宣言されたローカル変数を回復する方法を知っている人はいますか?または、GetVariablesにアクセスする方法はありませんか?