C# 用C打印源文件名和行号#
有没有办法在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)
非常感谢这个答案已经过时了!更多最新信息,请参见@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");