2

我想编写一个 Visual Studio 宏或类似的东西,它可以获取函数名称并插入错误报告部分的预设位置。看例子就更清楚了

Class SampleClass
{
    public void FunctionA()
    {
        try
        {
                //Do some work here
        }
        catch (Exception ex)
        {
                Logger.WriteLine(LogLevelEnum.Error, "SampleClass", "FunctionA Failed");
                Logger.WriteLine(LogLevelEnum.Error, "FunctionA", ex.ToString());
        }
        finally
        {
        }
    }
}

因此,我遵循了我的公共库的大多数关键功能的类似模式。我希望能够在预构建期间将“FunctionA”插入日志记录部分,这样我就不必记住输入正确的名称或在复制和粘贴后忘记重命名它。可以从工具栏手动调用,也可以通过快捷键调用。

那么,我应该从哪里开始呢?

注意:我被认为是 .Net 的中级人员,用 C# 和 VB 编写了 3 年多,但我对宏很陌生,不过不介意学习。不要担心代码本身和异常,这只是一个例子。

编辑:感谢 Ovidiu Pacurar 和 cfeduke。我在这里想要的是一种一次性的改变和忘记的方法。PostSharp 将在这些函数中的每一个上产生开销,即使没有抛出异常也是如此。从堆栈跟踪中挖掘是可行的,但在某些时候,我也想只记录“FunctionA Failed”,而不需要花费太多处理来获取堆栈跟踪。此外,如果库被混淆,堆栈跟踪将是神秘的。

实际上,这个功能还有另一个需要,我之前忘记提到了。当库准备好交付时,我想将所有的函数名改成函数代码,“FunctionA”可能是“0001”,通过引用一个表来解决“混淆”日志问题。

4

3 回答 3

1

看一下 System.Diagnostics.StackTrace,然后您可以只创建一个日志调用,从堆栈中获取函数。

于 2008-10-30T17:17:23.910 回答
1

我希望 C# 有__FILE____LINE__-like 宏,但它没有。但是,您可以使用PostSharp对 C# 进行后编译。这样做的好处是不必在运行时调用堆栈跟踪的开销来获取方法名称。性能开销可能不是您在异常处理程序期间关心的问题,但无论如何 PostSharp 是另一个可以执行该工作的可用工具。

PostSharp 的示例视频与您尝试做的事情类似。看看 PostSharp 网站首页上的这个示例代码,让你的齿轮转动:

public  class SimplestTraceAttribute : OnMethodBoundaryAspect
{
  public override void OnEntry( MethodExecutionEventArgs eventArgs)
  {
    Trace.TraceInformation("Entering {0}.", eventArgs.Method);
    Trace.Indent();
  }
  public override void OnExit( MethodExecutionEventArgs eventArgs)
  {
    Trace.Unindent();
    Trace.TraceInformation("Leaving {0}.", eventArgs.Method);
  }
}
于 2008-10-30T17:27:51.457 回答
0

看看PostSharp。它允许您以非常简单的方式和更多方式来做到这一点。

也有带有日志记录的样本。

于 2008-10-30T17:26:48.167 回答