Как получить текущую трассировку вызова метода?включая пути к файлам и номера строк кода - PullRequest
0 голосов
/ 21 мая 2018

Если я использую этот код:

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

Похоже, мой пост в основном кодовый;поэтому мне нужно набрать больше слов здесь ...

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Да. Используя атрибуты 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 документация также достаточно хороша.

0 голосов
/ 21 мая 2018

Существует несколько специальных (и не очень известных) параметров атрибута информации о вызывающем абоненте, которые вы можете использовать, например, у меня есть оболочка вокруг моей реализации 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

Вывод файла журнала:

ОШИБКА XYZ.Tools.Emailing.Email - MemberName: SendEmail, SourceLineNumber of 129, Сообщение: сбой отправки электронной почты через сервер Exchange.

...