**我正在使用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")]
答案 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()
方法。