Вставить имя функции во время PreBuild - PullRequest
2 голосов
/ 30 октября 2008

Я хотел написать макрос 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, не против учиться. Не беспокойтесь о самом коде и исключении, это всего лишь пример.

EDIT: Спасибо Овидиу Пакурару и cfeduke. То, что я хотел здесь, было одним способом изменить и забыть. PostSharp будет нести издержки на каждую из этих функций, даже если исключение не выдается. Копирование из трассировки стека возможно, но в какой-то момент я также хотел бы просто записать в журнал «FunctionA Failed», не затрачивая слишком много времени на получение трассировки стека. Более того, если библиотека будет запутана, трассировка стека будет загадочной.

На самом деле была еще одна потребность в этой функции, о которой я забыл упомянуть ранее. Когда библиотека будет готова к доставке, я хотел бы изменить все имя функции на код функции, «FunctionA» может быть «0001», ссылаясь на таблицу, чтобы решить «запутанную» проблему журнала.

Ответы [ 3 ]

1 голос
/ 30 октября 2008

Хотелось бы, чтобы в C # были __FILE__ и __LINE__ -подобные макросы, но это не так. Однако вы можете посткомпилировать процесс C #, используя PostSharp . Преимущество этого состоит в том, что нет необходимости вызывать служебную информацию трассировки стека для получения имени метода во время выполнения. Снижение производительности может быть не тем, о чем вы беспокоитесь во время обработки исключений, но в любом случае 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);
  }
}
1 голос
/ 30 октября 2008

Взгляните на System.Diagnostics.StackTrace, и затем вы можете создать всего один вызов журнала, получая функцию из стека.

0 голосов
/ 30 октября 2008

Посмотрите на PostSharp . Это позволяет делать это очень простым способом и многое другое.

Также есть образцы с логированием.

...