PostSharp를 사용하여 Silverlight 개체에 대한 호출을 가로채시나요?

StackOverflow https://stackoverflow.com/questions/97733

  •  01-07-2019
  •  | 
  •  

문제

PostSharp를 사용하여 내가 소유하지 않은 개체에 대한 메서드 호출을 가로채고 있지만 측면 코드가 호출되지 않는 것 같습니다.Silverlight 영역에서는 문서가 상당히 느슨한 것 같으므로 여러분이 제공할 수 있는 도움에 감사드립니다. :)

다음과 같은 속성이 있습니다.

public class LogAttribute : OnMethodInvocationAspect
{
    public override void OnInvocation(MethodInvocationEventArgs eventArgs)
    {
        // Logging code goes here...
    }
}

그리고 내 AssemblyInfo의 항목은 다음과 같습니다.

[assembly: Log(AttributeTargetAssemblies = "System.Windows", AttributeTargetTypes = "System.Windows.Controls.*")]

그래서 제가 당신에게 드리는 질문은...내가 무엇을 놓치고 있나요?일치하는 속성 대상 아래의 메서드 호출이 작동하지 않는 것 같습니다.

도움이 되었습니까?

해결책

현재 버전의 PostSharp에서는 이것이 불가능합니다.

PostSharp는 CLR에 의해 로드되기 전에 어셈블리를 변환하는 방식으로 작동합니다.지금 당장 그렇게 하려면 두 가지 일이 일어나야 합니다.

  • 어셈블리가 CLR에 로드되려고 해야 합니다.당신은 단 한 번의 기회만 얻을 수 있고, 이 시점에서 그것을 얻어야 합니다.
  • 변환 단계가 완료된 후에는 추가 수정을 할 수 없습니다.즉, 런타임에 어셈블리를 수정할 수 없습니다.

최신 버전인 1.5 CTP 3, 이 두 가지 제한 사항 중 첫 번째 제한 사항을 제거합니다., 하지만 실제로 문제는 두 번째입니다.그러나 이는 요청이 많은 기능, 그러니 눈을 떼지 마십시오.

사용자는 종종 런타임에 PostSharp를 사용할 수 있는지 묻습니다. 따라서 컴파일 타임에 측면을 알 필요가 없습니다.배포 후 측면을 변경하면 지원 담당자가 소프트웨어의 개별 부분에 대한 추적 또는 성능 모니터링을 활성화/비활성화할 수 있으므로 실제로 큰 이점이 있습니다. 이를 통해 얻을 수 있는 멋진 기능 중 하나는 타사 어셈블리에 측면을 적용하는 것입니다.

가능하냐고 묻는다면 짧은 대답은 '그렇다'입니다! 불행하게도 긴 대답은 더 복잡합니다.

런타임/타사 측면 문제

저자는 또한 런타임 시 수정을 허용할 경우 발생하는 몇 가지 문제에 대해 설명합니다.

이제 문제는 무엇입니까?

  • 부트스트래퍼를 연결합니다. 코드가 호스팅 된 경우 (예 : ASP.NET 또는 COM 서버에서) 부트 스트랩을 연결할 수 없습니다.따라서 모든 런타임 직조 기술은 응용 프로그램을 직접 호스팅해야한다는 제한에 묶여 있습니다.
  • CLR보다 앞서야 합니다. CLR이 변환되지 않은 어셈블리를 자체적으로 찾으면 변형 된 것을 요구하지 않습니다.따라서 변환 된 응용 프로그램에 대한 새로운 애플리케이션 도메인을 만들고 변환 된 어셈블리를 이진 경로에 넣어야 할 수도 있습니다.큰 문제가 아닐 수도 있습니다.
  • 강력한 이름. 윽.런타임에 어셈블리를 수정하면 강한 이름을 제거해야합니다.작동할까요?네, 대부분요.물론이 어셈블리에 대한 모든 참조에서 강한 이름을 제거해야합니다.그건 문제가되지 않습니다;PostSharp는 상자 밖으로 지원합니다.그러나 포스트 샤프가 도울 수없는 것이 있습니다.문자열이나 파일에 강력하게 명명 된 참조가있는 경우 (예 : App.Config)를 찾아서 변환 할 수 없습니다.그래서 우리는 진정한 제한 사항이 있습니다.강력하게 명명 된 어셈블리에 "느슨한 참조"가있을 수 없습니다.우리는 실제 참조 만 변환 할 수 있습니다.
  • LoadFrom. 어셈블리가 Assembly.LoadFrom, Assembly.LoadFile 또는 Assembly.LoadBytes를 사용하는 경우 부트 스트랩이 건너 뜁니다.

다른 팁

AttributeTargetAssemblies를 "PresentationFramework"로 변경하면 작동할 수 있다고 생각합니다.(아직 PostSharp를 그렇게 잘 다운시키지 않았습니다).

WPF용 어셈블리는 PresentationFramework.dll입니다.AttributeTargetAssemblies에는 대상으로 삼아야 하는 dll이 필요합니다.

PostSharp에는 "모든 다운로드"에 대한 다운로드 페이지 링크에서 액세스할 수 있는 새 버전이 있습니다.

포스트샤프 1.5Mono, Compact Framework 또는 Silverlight 지원 및 측면 상속과 같은 새로운 기능을 포함하는 PostSharp의 개발 분기입니다.새로운 기능을 시도하고 새로운 개발을 테스트하여 커뮤니티를 돕고 싶고 API의 낮은 신뢰성과 안정성을 수용할 수 있는 경우 이 분기에서 다운로드하세요.

버전은 현재 1.5 CTP 3이지만 Silverlight를 지원합니다.

프레임워크 내에서(즉, 자신의 코드가 아닌) 호출을 가로채려고 하면 작동하지 않습니다.PostSharp는 자체 어셈블리 내의 코드만 바꿀 수 있습니다.걸려오는 전화를 가로채려고 한다면 제대로 작동할 것 같습니다.빌드 출력에서 ​​PostSharp가 실행 중인 것을 볼 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top