我是AOP和PostSharp的新手。我试图将一个方面应用于预定义的类,例如System.Windows.Forms.Button类并拦截它的一些方法。 你能指导我如何用PostSharp做到这一点吗?我们可以使用PostSharp来捕获从给定类型的UIElement引发的事件吗?
非常感谢!
答案 0 :(得分:1)
MethodInterceptionAspect通过拦截呼叫站点上的呼叫来处理在外部DLL中声明的方法。这意味着方法本身不会被转换,而是改变了调用方法的位置。原始组件没有改变。
您可以通过在程序集上组播属性并明确指定AttributeTargetAssemblies
:
[assembly:MyAspect(AttributeTargetAssemblies="myassembly,...", AttributeTargetTypes="...", AttributeTargetMembers="..."]
这意味着几乎没有限制。例如,如果从外部代码调用代码,则不会拦截调用。在您的情况下,您可以使用它来拦截始终从设计器代码调用的方法(如this.Controls.Add(...)
)。
如果源代码中有按钮,我认为会有一种不同的可行方法。如果您创建LocationInterceptionAspect
并在Button
类型的所有字段上对其进行多播,您将能够拦截应用程序中所有按钮的创建。在方面代码(设置处理程序)中,您可以注册到这些按钮的Clicked
事件。
答案 1 :(得分:0)
我怀疑这是可能的,因为我不认为postharp的ilweaving步骤可以操纵已编译的外部dll。
你可以做的是实现你自己的按钮(从按钮延伸)并拦截这些方法