在PreBuild期间插入函数名称

时间:2008-10-30 17:11:04

标签: .net macros compilation

我想编写一个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年多,但我对Macro很新鲜,不介意学习。 不要担心代码本身和异常,这只是一个例子。

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我希望C#有__FILE____LINE__ - 就像宏一样,但事实并非如此。但是,您可以使用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);
  }
}

答案 2 :(得分:0)

看看PostSharp。它允许您以非常简单的方式执行此操作。

有样本也有记录。