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());
        }
    }

こんにちは、私は自分のプログラムでロギング ユーティリティを作成しています。ログの一部で、スタックトレースを使用してプログラム実行中の currentFile 名と Current Line 番号を表示したいと思います。ただし、コードの次の行は、ログ utiltiy の現在のファイルと行を返します。

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 に答える