0

**我正在使用 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")]
4

1 回答 1

2

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

这就是 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()方法。

于 2014-01-23T10:21:24.810 回答