我的方面:
[Serializable]
class DumbLogger : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
Log.Print("Entry: ") + args.Method.Name;
args.FlowBehavior = FlowBehavior.Continue;
}
}
这就是我用来修改mscorlib中的调用并试图将它们排除在我的类LOG中的修改
[assembly: MY_PROJECT.DumbLogger(
AttributeTargetTypes = "MY_PROJECT.Log",
AttributeExclude = true,
AttributePriority = 1)]
[assembly: MY_PROJECT.DumbLogger(
AttributeTargetAssemblies = "mscorlib",
AttributePriority = 2)]
但是..这并不成功,因为如果我用ILspy反编译器查看我的LOG类,我可以看到对任何类@mscorlib.dll的方法调用被修改,例如:
<>z__Aspects.<System.Object.ToString>b__v(text)
我想这样做的原因是因为当我输入方法Log.Print时,它将生成一个stackoverflow异常并将无限调用自己。
我已经知道可能会从mscorlib中排除某些名称空间和类,例如字符串,但我有理由按照我描述的方式进行操作。
答案 0 :(得分:0)
PostSharp方面通常应用于声明(程序集,类型,方法,参数,字段等)。当您在外部方法上应用MethodLevelAspect
(基类OnMethodBoundaryAspect
)时,PostSharp会转换调用站点(IL中的call
指令),但仍然认为该方面正在启用声明本身。
目前无法按呼叫网站进行过滤,因此需要不同类型的方面和/或建议。因此,程序集上的AttributeExclude=true
指定属性没有任何影响,因为它表示不应在Log
类型上应用该方面,而不是ThreadStatic
类型。
解决这种情况的常用技术是使用[Serializable]
class DumbLogger : OnMethodBoundaryAspect
{
[ThreadStatic] private static bool logging;
public override void OnEntry(MethodExecutionArgs args)
{
if (logging)
return;
try
{
logging = true;
Log.Print("Entry: " + args.Method.Name);
args.FlowBehavior = FlowBehavior.Continue;
}
finally
{
logging = false;
}
}
}
变量来打破递归周期,如下面的代码所示:
MethodInterception
另请注意,OnMethodBoundary
和RF24Wave
方面是唯一适用于外部装配的方面。