PostSharp - 将方面应用于mscorlib,但禁止在我自己的类中修改调用

时间:2017-01-24 01:13:41

标签: .net-assembly postsharp

我的方面:

[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中排除某些名称空间和类,例如字符串,但我有理由按照我描述的方式进行操作。

1 个答案:

答案 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

另请注意,OnMethodBoundaryRF24Wave方面是唯一适用于外部装配的方面。