在C#中打印源文件名和行号

时间:2011-06-16 08:43:03

标签: c#

有没有办法在C#代码中检索当前的源文件名和亚麻,并在控制台输出中打印该值?喜欢C中的 LINE FILE

请告知。

非常感谢

6 个答案:

答案 0 :(得分:68)

Anders Hejlsberg presented new API for that in BUILD keynote:

打印当前文件名方法名称行号

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参数定义方法,并使用special attributes修饰它们。如果你调用方法而不传递实际参数(保留默认值) - Framework会为你填充它们。

答案 1 :(得分:33)

这个答案已经过时了!有关最新信息,请参阅@taras的答案。


没有常数:(

你可以做的事情更加丑陋:

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

仅在PDB文件可用时才有效。

答案 2 :(得分:1)

您可以使用System.Diagnostics命名空间中的StackTrace对象,但只有PDB文件存在时才能使用该信息。

默认情况下,为Debug和Release构建生成PDB文件,唯一的区别是Debug设置为生成完整的调试信息,其中Release版本设置为仅生成pdb(full / pdb-only)。

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

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

答案 3 :(得分:1)

截至目前,没有为此定义常量。

.NET的做法是使用StackTrace类。

但它仅适用于Debug版本。因此,如果您使用它,您可以在

之间使用StackTrace获取代码
#if DEBUG
    //your StackTrace code here
#endif

您可以在以下Stackoverflow线程中阅读有关在DEBUG与RELEASE版本中使用#if预处理器的信息。

C# if/then directives for debug vs release

编辑:如果您仍然需要发布版本中的此调试信息,请阅读Stackoverflow上的以下答案:

Display lines number in Stack Trace for .NET assembly in Release mode

答案 4 :(得分:1)

如果你想要更多的内部细节,但你没有特别需要文件名和行号,你可以这样做:

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

这比打印文件名更有优势,因为如果将它放在父类中,它将打印出实际运行代码的子类名。

答案 5 :(得分:0)

如果您想编写自己的 Debug.Assert 版本,那么这里有一个更完整的答案:

// CC0, Public Domain
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System;

public static class Logger {
    [Conditional("DEBUG")]  
    public static void Assert(bool condition, string msg,
            [CallerFilePath] string file = "",
            [CallerMemberName] string member = "",
            [CallerLineNumber] int line = 0
            )
    {
        // Debug.Assert opens a msg box and Trace only appears in
        // a debugger, so implement our own.
        if (!condition)
        {
            // Roughly follow style of C# error messages:
            // > ideone.cs(14,11): error CS1585: Member modifier 'static' must precede the member type and name
            Console.WriteLine($"{file}({line}): assert: in {member}: {msg}");
            // Or more precisely match style with a fake error so error-parsing tools will detect it:
            // Console.WriteLine($"{file}({line}): warning CS0: {msg}");
        }
    }
}

class Program {
    static void Main(string[] args) {
        Logger.Assert(1+1 == 4, "Why not!");
    }
}

Try it online