System.Reflection.Emit を使用して、実行時にソース コードからコードを生成しています (はい - コンパイラのように)。MarkSequencePoint などを使用して ILGenerator に正しいシンボル情報を提供し、AssemblyBuilder ですべてのデバッグ フラグを有効にします。アセンブリは、それをコンパイルしたのと同じプロセスでメモリに保持され、直接実行されます。
Visual Studio デバッガーを使用して動的に生成されたコードのソースをステップ実行すると、実際には完全に機能し、Visual Studio はファイルと行番号に関してコードがどこから来たのかを完全に認識しているようです。
HOWEVER -生成されたコードによって例外がスローされると、System.Exception オブジェクトには完全に間違ったスタック トレースが含まれます。それらは、他の (有効だが間違った) ファイルと行番号を指しています。クラスとメソッド名は正しく取得されますが、ポイントされているファイルと行番号は、実際に例外が発生したコード パスとは何の関係もありません。
指摘されたファイルは無関係であるため、インライン化または最適化にリンクできないようです。私が見つけることができる唯一のパターンは、いくつかのファイルによってオフセットされているように見えることです (アセンブリが構築された元のソース ファイルのアルファベット順に並べ替えられた架空のリスト内)。ただし、このパターンは 100% 一貫しているわけではなく、これが問題の原因に関連しているとは思えません。
例外から System.Diagnostics.Debug オブジェクトを構築すると、同じエラー情報が含まれます。
.NET ランタイムは、デバッガーがコードのステップ実行に使用するものと同じメタデータを使用して例外スタック トレースを作成すると想定しています。この場合、この動作は非常に奇妙です。
これが動的なインメモリ アセンブリを処理する際の .NET の既知のバグであるかどうか、または他の領域で同様の問題が発生したことがあるかどうかを調べようとしています。