2016-10-20 3 views
2

레거시 코드가 있으며 응용 프로그램 호출 'Execute'메서드를 알고 싶습니다.정적 메서드에 대한 인터셉터

레거시 코드 구조 :

public class CmsJob 
{ 
    public static string Execute() 
    { 
    } 
} 

그 후, 또는 정적 메소드 실행 전에 추가 동작을 구현 IInterceptor 또는 PostSharp.dll 사용할 수있다?

+0

저는 그렇게 생각하지 않습니다. 정적 메서드는 본질적으로 모의하기가 매우 어렵습니다. 일반적으로 인터셉터는 다형성 + 프록시를 기반으로합니다. 정적 인 기능은 사용할 수 없습니다. 그러한 생각을하려면 아마 가짜 dll을 가짜 Execute 메소드로 만들어야한다.이 메소드는 aganist를 dll에 연결하고 인터셉터 로직을 실행 한 다음 Execute를 호출한다. 물론 위의 dll과 프로젝트를 연결해야합니다. – user2184057

+0

Thanks @ user2184057. 내 가정을 확인했습니다 – Pavel

+0

소스를 수정하고 다시 컴파일 할 수 있습니까? 바이너리를 수정할 수 있습니까? 이 메서드가 포함 된 어셈블리에 서명되어 있습니까? –

답변

1

수정할 수없는 외부 어셈블리에서 선언 된 경우에도 PostSharp로 정적 메서드를 가로 챌 수 있습니다. 자신 만의 OnMethodBoundaryAspect을 구현할 수 있습니다.

[PSerializable] 
public class MyAspect : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     // Code to execute before the target method ... 
    } 
} 

그런 다음 어셈블리 수준에서 사용자의 프로젝트에서이 부분을 적용하고 이러한 속성 설정 : AttributeTargetAssemblies, AttributeTargetTypes, AttributeTargetMembers을.

관련 문제