PostSharp AOP - 无法将方面应用于mscorlib System.IO.StreamReader成员

时间:2014-01-22 22:04:55

标签: postsharp aop aspect

**我正在使用PostSharp Express ...不确定这会在这个例子中有所作为。

我有一个OnMethodBoundary - > OnEntry方面,可以在我自己的代码中成功地在程序集级别向类成员进行多播,但当我尝试将其应用于mscorlibSystem.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")]

1 个答案:

答案 0 :(得分:2)

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

这就是为什么PostSharp在使用AttributeTargetAssemblies将方面应用于引用的程序集时使用不同的方法。 PostSharp不会修改目标第三方程序集,而是修改从程序集到目标程序集的调用。

当然,这可以为您提供更少的注入代码的选项。例如,PostSharp可以检测对库方法的调用,并在该调用周围注入方面。但是你不能从库中注入类型的静态或实例构造函数。

在应用方面时,您还需要注意AttributeTargetTypes属性。例如,您希望在调用StreamReader.ReadLine()方法时应用方面。此虚拟ReadLine()方法最初在TextReader类上声明,StreamReader覆盖该方法。如果查看IL,则方法调用如下所示:

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

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