GetFileColumnNumber() および GetFileLineNumber() のメンバーとしての StackFrame は、実際には関数呼び出しの行/列を提供するのではなく、前のコロンの後の行の最初の文字を提供するようです。たとえば、次のようなコードがある場合
class A {
A foo() {
StackTrace stackTrace = new StackTrace(true);
StackFrame[] stackFrames = stackTrace.GetFrames();
Console.WriteLine( stackFrames[1].GetFileLineNumber()+":"+
stackFrames[1].GetFileColumnNumber());
return this;
}
}
A a = new a();
a.foo(). // assume this is line 10, column 4
foo().
foo();
出力がこれになることを望んでいました。これは、各呼び出しのf
inの場所ですfoo
10:6
11:6
12:6
しかし、代わりに
10:4
10:4
10:4
これは最初の の場所ですa
。これは、ブレークポイントの位置と一致しています。ブレークポイントを 2 番目または 3 番目の foo に配置しようとすると、最初の foo に表示されます。
正確な行/列情報を取得する方法について何か考えはありますか? 自己修正コードを書いたので、正しいファイル位置を見つける必要があります。私は列番号を無視してきました (これは間違っています) が、行番号が正確であることに依存しています。たとえば、セミコロンを使用すると機能します。
a.foo();
b.foo();
c.foo();
ILoffset は foo への呼び出しごとに変更されます... IL オフセットをソース コードにマップする別の方法があるのだろうか?