【问题标题】:PostSharp AOP - Unable to apply aspect to mscorlib System.IO.StreamReader membersPostSharp AOP - 无法将方面应用于 mscorlib System.IO.StreamReader 成员
【发布时间】:2015-09-10 05:02:58
【问题描述】:

**我正在使用 PostSharp Express...但不确定这会在这种情况下产生什么影响。

我有一个 OnMethodBoundary->OnEntry 方面,它在我自己的代码中成功地在程序集级别多播到类成员,但是当我尝试将它应用到 mscorlib System.IO.StreamReader 成员时,没有骰子.根据我在 PostSharp 网站、SO 和 Google 上所做的搜索,我无法判断当前版本的 PostSharp 解决此问题的正确方法是什么。有人知道吗?希望我只是缺少一些简单的东西:\

这是我正在使用的多播属性后面的方面:

namespace Test.Aspects {
    [AttributeUsage(AttributeTargets.Assembly)]
    [MulticastAttributeUsage(MulticastTargets.Method, AllowMultiple = false)]        
    [Serializable]
    public class PatchStreamReaderAttribute : OnMethodBoundaryAspect {
        public override void OnEntry(MethodExecutionArgs args) {
            System.Threading.Thread.Sleep(1000);
        }
    }
}

[assembly: PatchStreamReader(AttributeTargetMembers = "ReadLine", AttributeTargetAssemblies = "mscorlib", AttributeTargetTypes = "System.IO.StreamReader")]

【问题讨论】:

    标签: postsharp aop aspect


    【解决方案1】:

    通常,当您在给定程序集中应用方面时,PostSharp 将在其构建过程中修改该程序集。当然,mscorlib 不会发生这种情况,或者事实上,对于您引用但不是从源代码构建的任何 3 方库,都不会发生这种情况。

    这就是 PostSharp 在使用 AttributeTargetAssemblies 将方面应用到引用的程序集时使用不同方法的原因。 PostSharp 不会修改目标第 3 方程序集,而是修改从您的程序集到目标程序集的调用。

    当然,这会减少您可以在何处注入代码的选择。例如,PostSharp 可以检测对库方法的调用并围绕该调用注入方面。但是您不能在库中类型的静态或实例构造函数周围注入方面。

    在应用方面时还需要注意AttributeTargetTypes 属性。例如,您希望在对StreamReader.ReadLine() 方法的调用上应用方面。这个虚拟的ReadLine() 方法最初是在TextReader 类上声明的,StreamReader 覆盖了该方法。如果你看一下IL,那么方法调用是这样的:

    callvirt instance string [mscorlib]System.IO.TextReader::ReadLine()
    

    这意味着您需要将AttributeTargetTypes 属性设置为"System.IO.TextReader" 以将方面应用于ReadLine() 方法。

    【讨论】:

    • 有道理,但即使我将目标元素更改为方法,它仍然不起作用。我正在使用 PostSharp Express,但我没有看到任何关于在该版本中禁用此类功能的任何信息。
    • 我更新了我的问题,以更好地描述我遇到的一般问题。
    • 我已经更新了答案。您需要将AttributeTargetTypes 设置为“System.IO.TextReader” - 最初声明ReadLine() 方法的类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多