2014-01-28 1 views
5

PostSharp 3.1에서 CompileTimeInitialize에 리플렉션을 사용할 수 있습니까?Refresh를 PostSharp 3.1의 CompileTimeInitialize에서 사용할 수 있습니까?

다음 코드는 3.0에서 일 :

public class TestClass 
{ 
    public string TestField; 

    [TestAspect] 
    public void TestMethod() { } 
} 

public class TestAspect : OnMethodBoundaryAspect 
{ 
    private LocationInfo locationInfo; 

    public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) 
    { 
     this.locationInfo = new LocationInfo(method.ReflectedType.GetField("TestField")); 
    } 

    public override void OnSuccess(MethodExecutionArgs args) 
    { 
     Console.WriteLine(this.locationInfo); 
    } 
} 

을 3.1 업그레이드를 통해, this.locationInfoMissing Property되고 속성 중 하나가 NullReferenceException의 원인에 접근.

잘못된 방법으로 수행했거나 3.1 업그레이드에서 변경 되었습니까? 그렇다면 올바른 접근 방식을 제안 해주세요.

추신 : this.locationInfoRuntimeInitialize에 설정하면 정상적으로 작동합니다.

답변

4

CompileTimeInitialize 메서드에서 리플렉션을 사용할 수 있으며 실제로는 locationInfo에 해당 메서드 실행 중에 올바른 정보가 들어 있습니다.

그러나 locationInfo 필드는 일련 번호가 지정되고 나중에 런타임 중에 deserialize됩니다. 문제가 발생하는 곳입니다. 분명히 버전 3.1에서는이 특별한 경우 직렬화와 관련된 버그가 있습니다. 예를 들어, 필드에 locationInfo.Name 만 저장하여이를 확인할 수 있습니다.

3.1에서 버그 수정이 구현 될 때까지 기다려야한다는 것을 의미합니다. PostSharp support forum에서 직접 버그를 신고 할 수도 있습니다.

업데이트 :이 문제는 PostSharp 빌드 3.1.30에서 수정되었습니다.

+0

감사합니다. 이제 나는 그것이 내 편이 아니라는 것을 알고있다. PostSharp 포럼에보고 해 드리겠습니다. –