似乎 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();
每次调用 foo 时,ILoffset 都会发生变化......我想知道是否有另一种方法可以将 IL 偏移量映射到源代码?