2008-10-30 4 views
2

Visual Studio 매크로 또는 함수 이름을 가져올 수있는 유사한 함수를 작성하여 오류 보고서 부분의 사전 설정 위치에 삽입하고 싶습니다. 예제를 보면 더 명확 해집니다.PreBuild에서 함수 이름 삽입

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 년 이상 writting했지만 매크로를 처음 사용하는 경우에는 익숙하지 않습니다. 코드 자체와 예외는 걱정하지 마십시오. 이는 단지 예일뿐입니다.

편집 : 감사합니다. Ovidiu Pacurar 및 cfeduke. 제가 원했던 것은 변화와 잊을 수있는 유일한 길이었습니다. PostSharp는 예외가 발생하지 않는 경우에도 이러한 모든 함수에 오버 헤드가 발생합니다. stacktrace에서 파기는 가능하지만 어느 시점에서 stacktrace를 가져 오는 데 너무 많은 처리를하지 않고도 "FunctionA Failed"를 기록하고 싶습니다. 더 나아가 라이브러리가 난독 화되면 stacktrace는 암호화 될 수 있습니다.

실제로이 기능에 대한 또 다른 필요성이있었습니다. 이전에는 언급하지 않았습니다. 라이브러리가 전달 될 준비가되면 모든 함수 이름을 함수 코드로 변경하고 테이블을 참조하여 "FunctionA"가 "0001"이 될 수 있으므로 "난해한"로그 문제를 해결할 수 있습니다.

답변

1

System.Diagnostics.StackTrace를 살펴보고 스택에서 함수를 가져 오는 로그 호출을 하나만 만들 수 있습니다.

0

PostSharp을 살펴보십시오. 아주 쉬운 방법으로 훨씬 더 많은 것을 할 수 있습니다.

로깅과 함께 샘플이 있습니다.

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); 
    } 
}