将方面应用于其他程序集 class 方法调用

apply an aspect to other assembly class methods calls

我创建了一个简单的方面:

[Serializable()]
public class NullableCallAspect : PostSharp.Aspects.OnMethodBoundaryAspect
{
    public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args)
    {
        if (args.Instance == null)
            args.FlowBehavior = PostSharp.Aspects.FlowBehavior.Return;
    }
}

本质上,我希望 instance.method 调用 instance == null 的任何一个都不会进入该方法。我正在弄清楚,我需要更改方面的继承。因此,我需要将 OnMethodBoundaryAspect 更改为另一个。这是第一个问题。

另一个问题是关于如何将此方面应用于从 类 继承另一个程序集的接口的方法调用。

我试过了,但不太奏效:

[assembly: UI.Aspects.NullableCallAspect(
    AttributeTargetAssemblies = "UIAppearanceExtensibility",
    AttributeTargetTypes = "UI.Appearance.Extensibility.*.I*AppearanceManager",
    AttributeTargetMembers = "handle*"
)]

这种方面需要 PostSharp 不支持的调用站点拦截。 OnMethodBoundaryAspect 和 MethodInterceptionAspect 都修改目标方法而不是调用站点本身 - 调用由这些方面装饰的方法时仍然需要实例。

编辑: 有一个 hack 如何强制 PostSharp 拦截呼叫站点。这是当一个方面被多播到不同程序集中的类型时。如果所有方法都在项目 ClassLibrary1 中实现并且它们仅从 MyApplication 项目中调用,那么可以在 MyApplication[ 中多播方面=29=] 像这样的项目:

[assembly:
    NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*",
        AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)]

如果约定所有 IAppearanceManager end 的实现都具有后缀 AppearanceManager 的名称,则需要更改多播:

[assembly:
    NullableCallAspect(AttributeTargetAssemblies = "ClassLibrary1", AttributeTargetTypes = "ClassLibrary1.*AppearanceManager",
        AttributeTargetMembers = "handle*", AttributeTargetElements = MulticastTargets.Method)]

如果没有这样的约定,则可以使用 IAspectProvider 进行多播。

当在同一程序集中调用由 NullableCallAspect 装饰的方法时,这将不可用 - 在这种情况下不会拦截调用站点。