2017-01-24 2 views
1

내 측면 수정 금지하는 측면을 적용 :PostSharp - mscorlib에하지만 내 자신의 클래스에서 호출

[Serializable] 
class DumbLogger : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     Log.Print("Entry: ") + args.Method.Name; 
     args.FlowBehavior = FlowBehavior.Continue; 
    } 
} 

이 난 mscorlib에의 호출을 수정하는 데 사용 및 내 수업에서 수정되는 것을 제외하려고 무엇을

[assembly: MY_PROJECT.DumbLogger(
    AttributeTargetTypes = "MY_PROJECT.Log", 
    AttributeExclude = true, 
    AttributePriority = 1)] 


    [assembly: MY_PROJECT.DumbLogger(
    AttributeTargetAssemblies = "mscorlib", 
    AttributePriority = 2)] 

그러나 LOG

라고 ..이 나던 트릭을 나는 방법은 예를 들어 수정되는 모든 클래스의 @의가 mscorlib.dll 호출을 볼 수 있습니다 ILspy의 디 컴파일러를 내 LOG 클래스를 보면 이유는

<>z__Aspects.<System.Object.ToString>b__v(text) 

내가 이것을하고 싶은 이유는 Log.Print 메서드를 입력하면 stackoverflow 예외가 발생하고 무한히 자체를 호출하기 때문입니다.

나는 이미 mscorlib의 string과 같은 특정 네임 스페이스와 클래스를 제외하고 있지만 이미 설명 된 이유가 있습니다.

답변

0

일반적으로 애스펙트는 선언 (어셈블리, 유형, 메소드, 매개 변수, 필드 등)에 적용됩니다. MethodLevelAspect (기본 클래스는 OnMethodBoundaryAspect)을 외부 메서드에 적용 할 때 PostSharp는 호출 사이트 (IL에서 call 명령)를 변환하지만 여전히 특성 자체를 선언 자체로 간주합니다.

현재 통화 사이트별로 필터링 할 방법이 없으며 다른 종류의 측면 및/또는 조언이 필요합니다. 따라서 조립품의 AttributeExclude=true 특성을 지정하는 것은 특성이 Log 유형에 적용되어서는 안됨을 나타내므로 효과가 없습니다.

정확히이 경우 다음과 같은 코드를 보여줍니다으로 재귀 고리를 끊어야하는 ThreadStatic 변수를 사용하는 것입니다 해결 일반적인 기술 :

[Serializable] 
class DumbLogger : OnMethodBoundaryAspect 
{ 
    [ThreadStatic] private static bool logging; 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     if (logging) 
      return; 

     try 
     { 
      logging = true; 
      Log.Print("Entry: " + args.Method.Name); 
      args.FlowBehavior = FlowBehavior.Continue; 
     } 
     finally 
     { 
      logging = false; 
     } 
    } 
} 

또한 MethodInterceptionOnMethodBoundary 측면이 유일한 측면이 작업 유의하시기 바랍니다 외부 어셈블리에.

+1

Daniel,이 작품은 얼마 전 (이 질문에 정말로 관련이없는)이 답변을 받았지만 덜 "해결 방법"이라는 생각이 들었습니다. –

+0

@JoaoVitor 현재 다른 방법은 없습니다. 그것은 미래에 바뀔 수도 있지만, CallSiteLevelAspect와 같은 무언가에 대한 계획은 없다. 왜냐하면 그것 없이는 불가능한 유스 케이스의 수가 아주 적기 때문이다. –

관련 문제