是否有编译时访问C#中的行号?

use*_*117 17 c#

我正在使用Visual Studio 2010编写一个C#程序,我希望将某些事件写入日志文件,并包含代码所在的行号.

我只发现了两种捕获行号的方法 - CallerLineNumber,它需要.Net 4.5/C#5(我的目标是.Net 4)和StackFrame.GetFileLineNumber,这显然需要调试版本和pdb文件才能正常工作,我正在生成一个发布版本,没有pdb文件.

但这是我没有得到的 - 以上都是运行时解决方案,但行号是编译时实体.为什么需要运行时解决方案?

我可以输入正确的行号作为文字常量,只需查看屏幕底部的内容,如"ln 175"...

LogEvent("It happened at line 175");
Run Code Online (Sandbox Code Playgroud)

但问题是,如果我在第175行之前编辑任何代码,我的文字可能不再正确.但编译器知道正确的行号,并且我过去曾使用过编程语言,它们只能将正确的行号作为编译时常量弹出.(例如,ANSI C和Microsoft C++支持预定义的宏调用 _LINE_)有没有办法让C#这样做?如果没有解决我的问题?

小智 1

一种选择是使用StackTrace 类,如下所示

 [Conditional("DEBUG")]
    public static void DebugPrintTrace()
    {
        StackTrace st = new StackTrace(true);
        StackFrame sf = st.GetFrame(1);
        Console.WriteLine("Trace "
            + sf.GetFileName() + " "
            + sf.GetMethod().Name + ":"
            + sf.GetFileLineNumber() + "\n");
    } 
Run Code Online (Sandbox Code Playgroud)