2017-10-25 28 views
0

데스크탑 응용 프로그램의 진단 로깅을 위해 PostSharp 5.0.35를 처음 사용하고 있습니다. 나는 Program.Main()에 나와있는 예제 코드를 추가하고 Initialise 방법이라고했습니다ApplyToStateMachine은 어떻게 설정합니까?

using PostSharp.Patterns.Diagnostics; 
using PostSharp.Patterns.Diagnostics.Backends.Log4Net; 
using PostSharp.Extensibility; 

[assembly: Log(
    AttributePriority = 1, 
    AttributeTargetMemberAttributes = MulticastAttributes.Protected | MulticastAttributes.Internal | MulticastAttributes.Public 
)] 
[assembly: Log(
    AttributePriority = 2, 
    AttributeExclude = true, 
    AttributeTargetMembers = "get_*" 
)] 

class AspectInitialiser 
{ 
    public void Initialise() 
    { 
     LoggingServices.DefaultBackend = new Log4NetLoggingBackend(); 
    } 
} 

코드 인해 .NET 프레임 워크 4.0 프로젝트 async 방법을 가지는 코드에 다음과 같은 오류 메시지를주고 컴파일되지 않습니다.

비동기 상태 시스템에 기능을 적용하는 것은 현재 대상 프레임 워크에서 지원되지 않습니다. 비동기 메소드에 애스펙트를 적용 할 때는 ApplyToStateMachine 속성을 false로 설정하십시오.

괜찮 았지만이 ApplyToStateMachine 속성은 어디에 있습니까? 찾을 수있는 유일한 문서는 부동산이 이미 어디에 있는지 알고 있다고 가정합니다.

+0

읽기 [페이지 (http://support.sharpcrafters.com/discussions/problems/1753-why-do-i-get-the-warning-the-aspect- 당신이 설정하지 않는 한 비 직관적 인 방식으로 행동 할 수 있습니다.) 그리고 [이 답변] (https : // 28965548 /attributetargetelements-multicasttargets-method-isnt-respected). –

+0

@KeyurPATEL,'ApplyToStateMachine'는'LogAttribute' 또는 그 수퍼 클래스의 멤버가 아닙니다. –

+2

사용자 정의 로깅을 개발할 수 있습니다. [여기를 참조하십시오] (https://stackoverflow.com/a/39929873/6741868). –

답변

1

PostSharp에서 공식 응답을 얻었으니 문제가 해결되었습니다.


안녕하세요

,

내가 프로젝트에서 당신은 .NET 프레임 워크 4.0에서 비동기에 대한 지원을 제공 Microsoft.Bcl.Async 패키지를 사용하고있는 것으로 알고 있습니다. Microsoft.Bcl.Async 패키지는 PostSharp에서 지원되지 않으므로이 구성에서 비동기 메소드를 처리 할 수 ​​없습니다. 아쉽게도 우리가 생성 한 오류 메시지는 매우 일반적이며 개선되어야합니다. 특히 LogAttributeApplyToStateMachine 속성을 전혀 노출하지 않습니다.

해결 방법 고유 한 파생 클래스를 만들고 CompileTimeValidate 메서드를 재정 의하여 비동기 메서드에서 LogAttribute을 완전히 사용하지 않도록 설정할 수 있습니다. 아래의 샘플은이 방법을 보여줍니다.

public class MyLogAttribute : LogAttribute 
{ 
    public override bool CompileTimeValidate(MethodBase method) 
    { 
     // C# compiler marks async methods with AsyncStateMachineAttribute 
     if (method.GetCustomAttributes(typeof(AsyncStateMachineAttribute), false).Length > 0) 
      return false; 

     return true; 
    } 
} 

알렉스