Expression.Lambdaを使用してデリゲートをコンパイルしています。StackTraceでコンパイルされたLambdaの最初のメソッドが見つかりません
最近、例外がスローされたときに、ターゲット代理人に焼き付けられた「トップレベル」メソッドがスタックトレースにないことに気付きました。
using System;
using System.Linq.Expressions;
using System.Reflection;
namespace Sandbox
{
public class Program
{
private static void Main()
{
var methodInfo = typeof(X).GetMethod(nameof(X.Method1), BindingFlags.Static | BindingFlags.Public);
var call = Expression.Call(methodInfo);
var compiledDelegate = Expression.Lambda<Action>(call, null).Compile();
try
{
compiledDelegate();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.ReadKey();
}
public class X
{
public static void Method1()
{
Method2();
}
public static void Method2()
{
Console.WriteLine("Strange");
throw new Exception();
}
}
}
}
.EXE(releasebuild)方法1が欠落していることを
System.Exception: Eine Ausnahme vom Typ "System.Exception" wurde ausgelöst.
bei Sandbox.Program.X.Method2() in [..]\Program.cs:Zeile 38.
bei lambda_method(Closure)
bei Sandbox.Program.Main() in [..]\Program.cs:Zeile 18.
お知らせを実行している時には、次のスタックトレースを取得します:
詳細な使用例は、この現象を再現します。
私の質問はここにあります:方法1を表示させるにはどうしたらいいですか?
Method1はインラインになっているようですが、コールスタックから削除する必要がありますか、間違っていますか?
インライン化は、 'Method1'の命令が直接実行されることを意味し、実際にはスタックトレースから削除されます。デバッグモードでの動作は何ですか? – Maarten
デバッグが表示されます。 – CSharpie
Method1に出力行を追加し、何が起こるかを確認してください。 – dasblinkenlight