Есть ли способ получить текущее имя исходного файла и linenumber в коде С# и напечатать это значение на выходе консоли? Как LINE и ФАЙЛ в C?
Просьба сообщить.
Большое спасибо
Есть ли способ получить текущее имя исходного файла и linenumber в коде С# и напечатать это значение на выходе консоли? Как LINE и ФАЙЛ в C?
Просьба сообщить.
Большое спасибо
Этот ответ устарел! См. Ответ @taras для получения более подробной информации.
Нет константы: (
Что вы можете сделать, это намного уродливее:
string currentFile = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName();
int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber();
Работает только тогда, когда доступны файлы PDB.
Андерс Хейлсберг представил новый 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
заполняет их для вас.
Вы можете использовать объект 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());
Нет констант, определенных для этого на данный момент.
Способ .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 в режиме выпуска
Если вы хотите получить более подробную внутреннюю информацию, но вам не нужно указать имя файла и номер строки, вы можете сделать что-то вроде этого:
System.Diagnostics.Debug.Print(this.GetType().ToString() + " My Message");
Это имеет преимущество перед печатью имени файла в том случае, если вы помещаете это в родительский класс, он распечатает имя дочернего класса, на самом деле выполняющее код.