2016-10-20 3 views
2

У нас есть устаревший код и вы хотите узнать, когда метод вызова «Выполнить». Структура кодаПерехватчик для статического метода

Legacy:

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

Можно ли использовать IInterceptor или PostSharp.dll осуществить дополнительную операцию до или после выполнения статического метода?

+0

Я так не считаю. Статические методы по самой своей природе очень сложно насмехаться. Обычно перехватчики базируются на полиморфизме + прокси. Вы не можете использовать любую из этих функций со статикой. Для такого мышления, вероятно, потребуется создать фальшивую dll с поддельным методом Execute, который связывает аганист вашей DLL и выполняет вашу логику перехватчика, а затем вызывает Execute. Конечно, вам нужно будет связать ваш проект с этой фальшивой dll. – user2184057

+0

Спасибо @ 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.

[assembly:MyAspect(AttributeTargetAssemblies="ThirdPartyAssembly", 
        AttributeTargetTypes="SomeNamespace.CmsJob", 
        AttributeTargetMembers="Execute")] 
Смежные вопросы