C# 用C打印源文件名和行号#

C# 用C打印源文件名和行号#,c#,C#,有没有办法在C代码中检索当前源文件名和行号,并在控制台输出中打印该值?像C中的行和文件 请告知 非常感谢这个答案已经过时了!更多最新信息,请参见@taras的答案。 没有常数:( 你能做的事情要丑陋得多: string currentFile = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName(); int currentLine = new System.Diagnostics.StackTrace(true)

有没有办法在C代码中检索当前源文件名和行号,并在控制台输出中打印该值?像C中的文件

请告知


非常感谢这个答案已经过时了!更多最新信息,请参见@taras的答案。


没有常数:(

你能做的事情要丑陋得多:

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

仅当PDB文件可用时才起作用。

您可以使用System.Diagnostics命名空间中的StackTrace对象,但信息仅在PDB文件存在时可用

PDB文件默认为调试和发布版本生成。唯一的区别是调试设置为生成完整的调试信息,而发布版本设置为仅生成PDB(仅完整/PDB)


到目前为止,还没有为此定义常量

NET的方法是使用类

但是,它只适用于调试版本。因此,如果您使用它,您可以使用StackTrace在

#if DEBUG
    //your StackTrace code here
#endif
您可以在下面的Stackoverflow线程中阅读关于为调试版本与发布版本使用#if预处理器的内容

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

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

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

程序.cs_Main(11):.NET岩石

这里发生了什么事?


您可以使用
可选的
参数定义一个方法,并用参数修饰它们。如果您在调用方法时没有传递实际参数(保留默认值),
框架将为您填充这些参数。

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

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

与打印文件名相比,这有一个优势,即如果您将其放入父类,它将打印出实际运行代码的子类名称。

请您再提供一点上下文,好吗?使用这些变量的目的是什么?这样我就可以实现调试日志中的有用消息。@krakat t现在有一个更好的方法,请查看我的回答我本来打算发布类似的内容,但如果您尝试在发布版本中使用此代码,则会出现问题。不过,它在调试模式下会工作得非常好。如果您需要使用此代码,请确保仅在调试版本中包含它。哦,是的!对不起,我的错误。:)@ZombieSheep和@Heandel与其说是内置于调试或发行版中,不如说是PDB文件是否可用,因为它们是包含调试信息的文件。PDB文件默认为调试和发布生成。调试PDB设置为包含完整的调试信息,其中as release设置为PDB only,这对于文件名和文件号来说仍然足够。我认为最重要的一点是“调用方信息值以文本形式发送到中间语言(IL)与异常的StackTrace属性的结果不同,结果不受模糊处理的影响。“。没有更多的思考来获得这些信息!为此,您需要包括:使用System.Runtime.CompilerServices;从MSDN开始:从4.5版开始提供
CallerMemberName
非常好,但是缺少
CallerTypeName
属性既令人困惑又恼火。
System.Diagnostics.Debug.Print(this.GetType().ToString() + " My Message");