1

我是一名 Visual C++.net 程序员,大约一年前转换为 C#,我真的很怀念__FILE__, 和__LINE__. 为了替换__FILE__,我编写了一个很好的函数来返回 class.method,这很棒,但是没有合适的替代方法__LINE__(如果我错了,请纠正我!)。

我了解语言差异和技术限制,以及推理,以及所有这些东西。

我要问的是:

编写一些 Visual Studio 扩展(我们所有的开发人员都会安装)是否可行,甚至可能,这将允许我们定义某种类型的令牌(~~LINE~~ 或其他东西),我们可以拥有当编译成可执行文件时,文本替换或将该符号切换到实际的 VS 行号?

我的扩展编程知识很少,我不知道分机。系统限制。

编辑澄清:

在 C++ 中__FILE__,一旦编译,将返回您在其中编写代码的当前文件,以及__LINE__您的当前行。这很重要,因为我们所有的日志记录系统(10 多年前)都需要一个 char* 用于文件,一个 int 用于我们正在记录的行。

C# 不能像 C++ 那样产生这两个“令牌”。

举个例子:

LoggingService.LogException(e, "file.cs", 1234);  

是我想要编译到我的可执行文件中的内容,并且

LoggingService.LogException(e, ~~MYFILE~~, ~~MYLINE~~); 

是我希望我的代码看起来的样子,并保存在磁盘上。我有一个合适的替代方法来获取文件,但我没有一个来获取文件。

编辑2:

这些我们的版本构建,没有调试符号。为了适应这个修复,我们的产品安装必须大几百兆,这是不可能的。

4

4 回答 4

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);
于 2012-07-12T18:37:03.997 回答
2

您可以先通过 C 预处理器简单地运行所有 C# 代码,然后再编译结果。您需要更改 CS 文件的构建规则才能做到这一点。

于 2012-07-12T18:26:20.383 回答
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

于 2012-07-12T18:26:12.567 回答
0

该行位于异常的堆栈跟踪中。但我认为您应该记录整个堆栈跟踪,而不是提取它,因为它还有其他有用的调试信息(加上行号有时会偏离几行,因为我相信预处理器语句)

如果您在 Web 窗体或 MVC 中使用 ASP.Net Web 应用程序,我强烈推荐ELMAH 。它负责所有的日志记录

于 2012-07-12T18:31:40.440 回答