Напечатайте исходное имя файла и номер белья в C # - PullRequest
34 голосов
/ 16 июня 2011

Есть ли способ получить текущее имя файла источника и номер белья в коде C # и распечатать это значение в выводе консоли? Как LINE и FILE в C?

Пожалуйста, сообщите.

Большое спасибо

Ответы [ 5 ]

69 голосов
/ 30 апреля 2013

Андерс Хейлсберг представил новый API для этого в ключевом примечании BUILD:

Печать текущего имя файла , имя метода и номер строки

private static void Log(string text,
                        [CallerFilePath] string file = "",
                        [CallerMemberName] string member = "",
                        [CallerLineNumber] int line = 0)
{
    Console.WriteLine("{0}_{1}({2}): {3}", Path.GetFileName(file), member, line, text);
}

Тест:

Log(".NET rocks!");

Выход:

Program.cs_Main (11): .NET качается!

Что здесь происходит?

Вы определяете метод с optional параметрами и украшаете их специальными атрибутами . Если вы вызываете метод без передачи фактических аргументов (оставьте значения по умолчанию) - Framework заполняет их для вас.

33 голосов
/ 16 июня 2011

Этот ответ устарел!См. Ответ @taras для получения более свежей информации.


Без констант: (

То, что вы можете сделать, намного страшнее:

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

Работает только при наличии файлов PDB.

1 голос
/ 13 мая 2015

Если вам нужны дополнительные внутренние детали, но вам не нужны конкретно имя файла и номер строки, вы можете сделать что-то вроде этого:

System.Diagnostics.Debug.Print(this.GetType().ToString() + " My Message");

Это имеет преимущество перед распечаткой имени файла в этомесли вы поместите это в родительский класс, он выведет имя дочернего класса, который фактически выполняет код.

1 голос
/ 16 июня 2011

На данный момент для этого не определены константы.

. NET способ сделать это с помощью StackTrace класс.

Однако он работает только для отладочных сборок. Так что, если вы используете его, вы можете иметь код с помощью StackTrace между

#if DEBUG
    //your StackTrace code here
#endif

Вы можете прочитать об использовании препроцессоров #if для ваших сборок DEBUG vs. RELEASE в следующем потоке Stackoverflow.

C # if / then директивы для отладки и выпуска

РЕДАКТИРОВАТЬ: Если вам все еще нужна эта информация отладки в выпусках builds, прочитайте следующий ответ по Stackoverflow:

Отображение номера строки в Stack Trace для сборки .NET в режиме выпуска

1 голос
/ 16 июня 2011

Вы можете использовать объект StackTrace из пространства имен System.Diagnostics, но информация будет доступна только при наличии файлов PDB.

Файлы PDB генерируются по умолчанию как для сборок Debug, так и для выпусков Release, единственное отличие состоит в том, что Debug настроен на генерацию полной информации об отладке, тогда как при сборке Release настраивается только создание pdb (full / pdb-only).

Console.WriteLine(new StackTrace(true).GetFrame(0).GetFileName());

Console.WriteLine(new StackTrace(true).GetFrame(0).GetFileLineNumber());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...