Распечатайте исходное имя файла и linenumber в С#

Есть ли способ получить текущее имя исходного файла и linenumber в коде С# и напечатать это значение на выходе консоли? Как LINE и ФАЙЛ в C?

Просьба сообщить.

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

Ответ 1

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


Нет константы: (

Что вы можете сделать, это намного уродливее:

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

Работает только тогда, когда доступны файлы PDB.

Ответ 2

Андерс Хейлсберг представил новый 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 заполняет их для вас.

Ответ 3

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

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

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

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

Ответ 4

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

Способ .NET это использовать класс StackTrace.

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

#if DEBUG
    //your StackTrace code here
#endif

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

С# если /then директивы для debug vs release

EDIT: на всякий случай вам понадобится эта информация для отладки в строках release, прочитайте следующий ответ на Stackoverflow:

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

Ответ 5

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

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

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