0

似乎 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 偏移量映射到源代码?

4

1 回答 1

2

我相信该职位记录在声明级别。

在你的第一个例子中,

a.foo().foo().foo(); 

是语句,而在第二个示例中,您有三个单独的语句。

于 2013-04-10T21:03:40.147 回答