Stampa il nome file e il numero di codice sorgente in C #

C’è un modo per recuperare il nome file e il codice di provenienza corrente nel codice C # e stampare quel valore nell’output della console? Come LINE e FILE in C?

Si prega di avvisare.

Grazie molto

Questa risposta è superata! Vedi la risposta di @taras per informazioni più recenti.


Nessuna costante 🙁

Quello che puoi fare è molto più brutto:

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

Funziona solo quando i file PDB sono disponibili.

Anders Hejlsberg ha presentato una nuova API per questo nel keynote di BUILD:

Stampa il nome del file corrente, il nome del metodo e il numero di riga

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

Test:

 Log(".NET rocks!"); 

Produzione:

Program.cs_Main (11): .NET rocks!

Cosa sta succedendo qui?

Definisci un metodo con parametri optional e decorali con attributi speciali . Se chiami il metodo senza passare argomenti reali (lascia i valori di default) – il Framework li popola per te.

È ansible utilizzare l’object StackTrace dallo spazio dei nomi System.Diagnostics ma le informazioni saranno disponibili solo se i file PDB sono presenti.

I file PDB sono generati per impostazione predefinita per entrambi i build Debug e Release, l’unica differenza è che Debug è configurato per generare una completa informazione di debug in cui la build Release è impostata per generare solo un pdb (completo / pdb-only).

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

Non ci sono costanti definite per quello al momento.

Il modo .NET di farlo sta usando la class StackTrace .

Funziona comunque solo per le build di Debug. Quindi nel caso lo si usi, è ansible avere il codice usando StackTrace tra

 #if DEBUG //your StackTrace code here #endif 

Puoi leggere informazioni sull’uso dei preprocessori #if per le build DEBUG e RELEASE nel seguente thread Stackoverflow.

Direttive C # if / then per debug vs release

MODIFICA: nel caso in cui siano ancora necessarie queste informazioni di debug nelle versioni di rilascio , leggere la seguente risposta su Stackoverflow:

Visualizza il numero di linee in Stack Trace per .NET assembly in modalità Release

Se vuoi qualche dettaglio interno in più, ma non hai specificatamente bisogno di nome file e numero di riga, puoi fare qualcosa del genere:

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

Questo ha un vantaggio rispetto alla stampa del nome del file in quanto se lo inserisci in una class genitore, stamperà il nome della class figlio che sta effettivamente eseguendo il codice.