c#

Imprima el nombre de archivo fuente y el número de lienzo en C#



(5)

¿Hay alguna manera de recuperar el nombre de archivo fuente actual y el número de pila en el código C # e imprimir ese valor en la salida de la consola? Al igual que LINE y FILE en C?

Por favor avise.

Muchas gracias


No hay constantes definidas para eso a partir de ahora.

La forma de hacerlo de .NET es usar la clase StackTrace .

Sin embargo, solo funciona para compilaciones de depuración. Entonces, en caso de que lo use, puede tener el código usando StackTrace entre

#if DEBUG //your StackTrace code here #endif

Puede leer sobre el uso de preprocesadores #if para sus construcciones DEBUG vs. RELEASE en el siguiente subproceso de .

C # If / then directivas para depuración frente a versión

EDITAR: en caso de que todavía necesite esta información de depuración en las compilaciones de lanzamiento , lea la siguiente respuesta en :

Mostrar el número de líneas en Stack Trace para el ensamblado de .NET en modo Release


Puede usar el objeto StackTrace desde el espacio de nombres System.Diagnostics, pero la información solo estará disponible si los archivos PDB están allí.

Los archivos PDB se generan de forma predeterminada para las compilaciones de depuración y liberación, la única diferencia es que Debug está configurado para generar una información de depuración completa mientras que la compilación de publicación está configurada para generar solo un pdb (completo / pdb-only).

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


Si quieres más detalles internos, pero no necesitas el nombre y el número de línea, puedes hacer algo como esto:

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

Esto tiene una ventaja sobre la impresión del nombre de archivo en que si lo coloca en una clase principal, imprimirá el nombre de la clase secundaria que realmente está ejecutando el código.


Anders Hejlsberg presentó una nueva API para eso en BUILD keynote:

Imprimir el nombre del archivo actual, el nombre del método y el número de línea

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); }

Prueba:

Log(".NET rocks!");

Salida:

Program.cs_Main (11): rocas de .NET

¿Que está pasando aqui?

Usted define un método con parámetros optional y los decora con atributos especiales . Si llama al método sin pasar los argumentos reales (dejar valores predeterminados), el Framework rellena por usted.


¡Esta respuesta está desactualizada! Ver la respuesta de @taras para obtener información más reciente.

Sin constante :(

Lo que puedes hacer es mucho más feo:

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

Funciona solo cuando los archivos PDB están disponibles.