2014-01-22 2 views
0

** PostSharp Express를 사용하고 있습니다 ...이 인스턴스에서 차이를 만들지 확신하지 못합니다. 성공적으로 내 자신의 코드에서 클래스 멤버 어셈블리 수준에서 멀티 캐스트>OnEntry 측면,하지만 난 mscorlibSystem.IO.StreamReader 회원, 아니 주사위에 적용 할 때 -포스트 샤프 AOP - mscorlib에 애스펙트를 적용 할 수 없습니다 System.IO.StreamReader 멤버

나는 OnMethodBoundary 있어요. PostSharp 웹 사이트, 여기에 그리고 Google에서 수행 한 검색을 기반으로,이 문제를 해결하는 올바른 방법이 PostSharp의 현재 버전과 어떤 관련이 있는지 알 수 없습니다. 아는 사람 있나요? 다행스럽게도 필자는 단순한 뭔가 누락 : 일반적으로

namespace Test.Aspects { 
    [AttributeUsage(AttributeTargets.Assembly)] 
    [MulticastAttributeUsage(MulticastTargets.Method, AllowMultiple = false)]   
    [Serializable] 
    public class PatchStreamReaderAttribute : OnMethodBoundaryAspect { 
     public override void OnEntry(MethodExecutionArgs args) { 
      System.Threading.Thread.Sleep(1000); 
     } 
    } 
} 

[assembly: PatchStreamReader(AttributeTargetMembers = "ReadLine", AttributeTargetAssemblies = "mscorlib", AttributeTargetTypes = "System.IO.StreamReader")] 

답변

2

, 주어진 어셈블리의 측면을 적용 할 때, PostSharp 그 어셈블리를 수정합니다 : 여기

\ 것은 내가 사용하고 멀티 캐스트 속성 다음에 화면입니다 빌드 프로세스 중에 물론 mscorlib 또는 실제로는 타사 라이브러리에 대해서는 참조 할 수 있지만 소스 코드로 빌드하지 마십시오.

따라서 PostSharp는 AttributeTargetAssemblies을 사용하여 참조 된 어셈블리에 애스펙트를 적용 할 때 다른 접근 방식을 사용합니다. PostSharp는 대상 타사 어셈블리를 수정하는 대신 어셈블리에서 대상 어셈블리로 호출을 수정합니다.

물론 코드를 삽입 할 수있는 옵션이 적습니다. 예를 들어, PostSharp는 라이브러리 메소드에 대한 호출을 감지하여 해당 호출 주위에 애스펙트를 주입 할 수 있습니다. 그러나 라이브러리에서 유형의 정적 또는 인스턴스 생성자 주위에 aspect를 삽입 할 수는 없습니다.

애스펙트를 적용 할 때는 AttributeTargetTypes 속성에도주의해야합니다. 예를 들어 StreamReader.ReadLine() 메서드 호출에 애스펙트를 적용하려고합니다. 이 가상 ReadLine() 메서드는 원래 TextReader 클래스에 선언되어 있고 StreamReader 메서드를 재정의합니다. 당신이 IL 보면, 다음 메소드 호출은 다음과 같습니다 : 이것은 당신이 ReadLine() 방법으로 화면을 적용 "System.IO.TextReader"AttributeTargetTypes 속성을 설정해야합니다 의미

callvirt instance string [mscorlib]System.IO.TextReader::ReadLine() 

.

+0

의미가 있지만 대상 요소를 메소드로 변경하더라도 여전히 작동하지 않습니다. 나는 PostSharp Express를 사용하고 있지만이 버전에서는이 기능을 사용할 수 없게되었습니다. –

+0

내가 겪고있는 일반적인 문제를보다 잘 설명 할 수 있도록 내 질문을 업데이트했습니다. –

+1

답변을 업데이트했습니다. 원래'ReadLine()'메소드를 선언 한 클래스 인 "System.IO.TextReader"에'AttributeTargetTypes'을 설정해야합니다. – AlexD