似乎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
在foo
中的位置10:6
11:6
12:6
但结果是
10:4
10:4
10:4
表示第一个a
的位置。这与断点的位置是一致的——如果你试图在第二个或第三个foo上放置一个断点,它会出现在第一个foo上。
关于如何获得准确的行/列信息的任何想法?我写了一些自我修改的代码,我需要找到正确的文件位置。我一直忽略列号(这是错误的),但依靠行号是准确的。如果您使用分号,例如
,它可以工作。a.foo();
b.foo();
c.foo();
ILoffset在每次调用foo时都会改变…我想知道是否有另一种方法来映射IL偏移到源代码?
我相信这个位置是在报表级别记录的。
在第一个例子中,
a.foo().foo().foo();
是语句,而在第二个示例中,您有三个独立的语句。