0
 static void WriteLog(String FullPath, String Log)
    {
        try
        {
            if (File.Exists(FullPath))
            {
                FileInfo Fi = new FileInfo(FullPath);
                if (Fi.Length > MaxFileSize * 1024)
                {
                    if (File.Exists(FullPath + ".Old"))
                    {
                        File.Delete(FullPath + ".Old");
                    }
                    File.Move(FullPath, FullPath + ".Old");
                }
            }
            string currentFile = System.IO.Path.GetFileName(new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName());
            int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber();
            File.AppendAllText(@FullPath, "[ " + MyTime.Now.ToString("dd/MM/yy HH:mm:ss") + " ] " + currentFile + "," + currentLine + "," + Log.Replace("\r\n", "\r\n                      ") + "\r\n");
        }
        catch (Exception ex)
        {
            utilities.Log(ex.ToString());
        }
    }

嗨,我正在我的程序中编写一个日志记录实用程序。日志的一部分,我想在使用堆栈跟踪的程序执行中显示当前文件名和当前行号。但是,然后以下代码行将返回日志实用程序的当前文件和行。

string currentFile = System.IO.Path.GetFileName(new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName());
int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber();

如何让堆栈跟踪返回调用函数的当前文件和行号?

4

2 回答 2

3

通过在方法属性上使用Caller Info属性,您可以获得文件名、成员/方法名和行号。

public void TraceMessage(string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0){
    Trace.WriteLine("message: " + message);
    Trace.WriteLine("member name: " + memberName);
    Trace.WriteLine("source file path: " + sourceFilePath);
    Trace.WriteLine("source line number: " + sourceLineNumber);
}

请注意,如果您没有加载程序集的调试符号,则此信息可能不可用。(为每个 .dll 文件匹配 .pdb 文件)

于 2013-03-19T01:56:14.070 回答
2

您需要在当前帧之前获取帧:

var previousFrame = new System.Diagnostics.StackTrace(true).GetFrame(1);
于 2013-03-19T01:31:04.740 回答