Postsharp AOP MethodInterception方面不起作用

时间:2018-04-25 13:46:57

标签: c# postsharp method-interception

我试图添加一个基于权限的属性,供我用WPF构建的现有Windows应用程序使用。 我的想法是拦截对某些命令的Canexecute方法的调用并返回false - 这将禁用按钮 - 所以我在一个解决方案上做了一个简单的例子,我已经添加了Postsharp的Nuget包并覆盖了OnInvoke方法,如下所示:

[Serializable]
public class PermissionBasedAttribute : MethodInterceptionAspect
{
    public string PermissionName { get; private set; }

    public PermissionBasedAttribute (string permissionName)
    {
        PermissionName = permissionName;
    }

    /// <summary>
    /// Upon invocation of the calling method, the PermissionName is checked.
    /// If no exception is thrown, the calling method proceeds as normal.
    /// If an exception is thrown, the virtual method MethodOnException is called.
    /// </summary>
    /// <seealso cref="MethodOnException(SecurityPermissionException)"/>
    public override void OnInvoke(MethodInterceptionArgs args)
    {
        try
        {
             /*
             * some logic to check the eligibility of the user, in case of
                not authorised an exception should be thrown.
             */
            args.Proceed();
        }
        catch (SecurityPermissionException ex)
        {
            args.ReturnValue = false;
            // MethodOnException(ex);
        }
    }

    /// <summary>
    /// Method can be overridden in a derived attribute class.
    /// Allows the user to handle the exception in whichever way they see fit.
    /// </summary>
    /// <param name="ex">The exception of type SecurityPermissionException</param>
    public virtual void MethodOnException(SecurityPermissionException ex)
    {
        throw ex;
    }
}

无论如何,在小例子中,每个东西都能正常工作,在简单的例子中使用不同的方法,比如使用devexpress。 但是当添加到现有应用程序时它根本不起作用,更确切地说:OnInvoke方法永远不会被命中,而属性的构造函数已被调用。

我不确定出了什么问题,但另外一个信息是,我发现现有的解决方案已经将Postsharp用于记录方面。 所以我使用了与项目使用的版本完全相同的版本,即从Nuget软件包管理器中选择此版本为4.2.26。

我尝试过的另一件事是我已经实现了CompileTimeValidate方法并且有目的地添加了一个代码,该代码应该在构建时引发异常。 在Small -Working示例中,它在构建时引发了异常。 而在尚未使用的现有应用程序中。在构建时它不会引起任何异常!!!。

更新: 我正在使用如下:

[PermissionBasedAttribute("Permission1") ]
public bool CanShowView()
{
return true;
}

1 个答案:

答案 0 :(得分:1)

事实证明Post Sharp在这个项目中被禁用了!我安装了Post Sharp扩展,然后去了Post Sharp部分我发现它被禁用了,一旦启用就搞定了