CS,__LINE__不可用,我们可以写一个替代方案吗?

时间:2012-07-12 18:16:31

标签: c# visual-c++ compilation c-preprocessor visual-studio-extensions

我是一名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:

这些我们的发布版本,没有调试符号。我们的产品安装量必须要大几百兆才能容纳这个修复,这是不可能的。

4 个答案:

答案 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。它负责所有的日志记录