我是一名Visual C ++。网络程序员,大约在一年前转换为C#,我真的很想念__FILE__
和__LINE__
。为了替换__FILE__
,我编写了一个很好的函数来返回class.method,这很棒,但是__LINE__
没有合适的替代方法(如果我错了,请纠正我!)。
我理解语言差异和技术限制,推理以及所有这些。
我要问的是:
编写一些可视化工作室扩展(我们所有的开发人员都已安装)是否实用,甚至可能,这将允许我们定义某种类型的令牌(~~ LINE ~~或其他东西),当编译成可执行文件时,我们可以更换文本或将符号切换到实际的VS行号吗?
我对扩展编程的了解很少,我不知道ext。系统限制。
编辑以澄清:
在C ++中,__FILE__
一旦编译完毕,将返回您编写代码的当前文件,以及当前行__LINE__
。这很重要,因为我们所有的日志记录系统(10年以上)都需要文件的char *,以及我们正在登录的行的int。
C#不能像C ++那样产生这两个'令牌'。
举个例子:
LoggingService.LogException(e, "file.cs", 1234);
是我想要编译成我的可执行文件的,
LoggingService.LogException(e, ~~MYFILE~~, ~~MYLINE~~);
是我希望我的代码看起来像,并保存在磁盘上。我有一个合适的替代方法来获取文件,但我没有一个可以获得该文件。
编辑2:
这些我们的发布版本,没有调试符号。我们的产品安装量必须要大几百兆才能容纳这个修复,这是不可能的。
答案 0 :(得分:3)
来电信息来自.NET 4.5。这将被编译,这是一个必须手动检查堆栈跟踪的重大改进:
http://msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx
public void LogException(Exception ex,
[CallerFilePath] string filePath = "",
[CallerLineNumber] int lineNumber = 0)
{
// Log it!
}
感谢编译器魔术,这将被称为:
LoggingService.LogException(e);
答案 1 :(得分:2)
您可以先通过C预处理器运行所有C#代码,然后再编译结果。您需要更改CS文件的构建规则才能执行此操作。
答案 2 :(得分:1)
注意:如果您正在处理异常,则堆栈帧处于异常中,因此不需要这样做。我曾经使用过这个来存储日志系统中的行和文件信息,这是我能想到的唯一用例 - 但它“不是那么快”。
警告:如果您的发布版本中没有符号,则部分此类信息将无法使用。
using System;
using System.Diagnostics ;
StackTrace st=new StackTrace (0,true);
StackFrame sf=new StackFrame ();
sf=st.GetFrame (0);
Console.WriteLine ("FileName: {0}",sf.GetFileName ());
Console.WriteLine ("Line Number: {0}",sf.GetFileLineNumber ());
Console.WriteLine ("Function Name: {0}",sf.GetMethod ());
还有列和类型以及其他一些东西......在这里查看更多内容。
http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.aspx
答案 3 :(得分:0)
该行位于异常的堆栈跟踪中。但是我认为您应该记录整个堆栈跟踪,而不是提取它,因为它有其他有用的调试信息(由于我相信预处理器语句,行号有时会有几行关闭)
如果您在Web窗体或MVC中使用ASP.Net Web应用程序,我强烈推荐ELMAH。它负责所有的日志记录