41 votes

Imprimer le nom du fichier source et le numéro de référence en C#

Existe-t-il un moyen de récupérer le nom du fichier source actuel et le numéro de lin dans le code C# et d'imprimer cette valeur dans la sortie de la console ? Comme LIGNE y DOSSIER en C ?

Veuillez nous conseiller.

Merci beaucoup

88voto

taras.roshko Points 2852

Anders Hejlsberg a présenté une nouvelle API à cet effet lors de la conférence BUILD :

Imprimer le courant nom du fichier , nom de la méthode y numéro de ligne

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!");

Sortie :

Program.cs_Main(11) : .NET, c'est génial !

Que se passe-t-il ici ?

Vous définissez une méthode avec optional et les décorer avec des paramètres attributs spéciaux . Si vous appelez une méthode sans passer d'arguments réels (en laissant les valeurs par défaut) - la fonction Framework les remplit pour vous.

37voto

Cicada Points 19550

Cette réponse est dépassée ! Voir Réponse de @taras pour des informations plus récentes.


Pas de constante :(

Ce que vous pouvez faire est beaucoup plus laid :

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

Ne fonctionne que si les fichiers PDB sont disponibles.

1voto

Ozair Kafray Points 7445

Il n'y a pas de constantes définies pour cela pour l'instant.

La méthode .NET consiste à utiliser Trace de pile classe.

Il ne fonctionne cependant que pour les versions Debug. Donc, si vous l'utilisez, vous pouvez avoir le code utilisant StackTrace entre

#if DEBUG
    //your StackTrace code here
#endif

Vous pouvez lire sur l'utilisation des préprocesseurs #if pour vos constructions DEBUG vs. RELEASE dans le fil de discussion Stackoverflow suivant.

Directives C# if/then pour debug vs release

EDIT : Juste au cas où vous auriez encore besoin de ces informations de débogage dans libération Pour en savoir plus, lisez la réponse suivante sur Stackoverflow :

Affichage du nombre de lignes dans la trace de pile pour l'assembly .NET en mode Release

1voto

Bronumski Points 5754

Vous pouvez utiliser l'objet StackTrace de l'espace de noms System.Diagnostics, mais les informations ne seront disponibles que si les fichiers PDB sont présents.

Les fichiers PDB sont générés par défaut pour les versions Debug et Release. La seule différence est que la version Debug est configurée pour générer une information de débogage complète alors que la version Release est configurée pour générer uniquement une pdb (full/pdb-only).

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

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

1voto

Denise Skidmore Points 1014

Si vous voulez plus de détails internes, mais que vous n'avez pas spécifiquement besoin du nom de fichier et du numéro de ligne, vous pouvez faire quelque chose comme ceci :

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

Cela présente un avantage par rapport à l'impression du nom de fichier, car si vous placez cela dans une classe parentale, le nom de la classe enfant qui exécute le code sera imprimé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X