如何获取当前方法调用跟踪?包括文件路径和代码行号

How to get current method call trace? including Filepaths and Code Line Numbers

如果我使用此代码:

static void Main()
{
    A();
}
static void A()
{
    B();
}
static void B()
{
    C();
}
static void C()
{
    System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
    Console.WriteLine(t);
}

我可以得到这个:

at test.MyClass.C()
at test.MyClass.B()
at test.MyClass.A()
at test.MyClass.Main()

但是如果我想要更多这样的信息,我该怎么办: 在

test.MyClass.C()  at Program.cs line 26
at test.MyClass.B()  at Program.cs line 22
at test.MyClass.A()  at Program.cs line 18
at test.MyClass.Main()  at Program.cs line 12

看来我的 post 主要是代码;所以我需要在这里输入更多的单词...

您可以使用一些特殊的(且不为人知的)调用者信息属性参数,例如,我有一个围绕我的 Log4Net 实现的包装器来获取源代码行号:

//I enhance the Log4Net logging by capturing the caller's name and the line of code number
public static void Error(Type source, object message, Exception e = null, [CallerMemberName] string memberName = "",
 [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
{
    ILog logger = getLogger(source);
    if (!logger.IsErrorEnabled) return;

    if (e == null)
        logger.Error(string.Format("MemberName: {0}, SourceLineNumber of {1}, Message: {2}", memberName, sourceLineNumber, message));
    else
        logger.Error(string.Format("MemberName: {0}, SourceLineNumber of {1}, Message: {2}", memberName, sourceLineNumber, message), e);

}

可选参数的这些属性允许我们获取成员名称、文件路径和源代码行号:

[CallerMemberName] string memberName = "",  
[CallerFilePath] string sourceFilePath = "",  
[CallerLineNumber] int sourceLineNumber = 0

日志文件输出:

ERROR XYZ.Tools.Emailing.Email - MemberName: SendEmail, SourceLineNumber of 129, Message: Sending email failed via Exchange server.

Yes.You可以通过Caller Info属性,获取某个方法的调用者信息和所有相关的调试信息msdn link https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/caller-information.

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

否则,如果您可以使用外部库来跟踪和记录每个信息,您可以使用 http://logging.apache.org/log4net/,the 文档也足够了。