如何设置 ApplyToStateMachine?

How do I set ApplyToStateMachine?

我第一次使用 PostSharp 5.0.35 在桌面应用程序中进行诊断日志记录。我添加了示例代码并在 Program.Main():

中调用了 Initialise 方法
using PostSharp.Patterns.Diagnostics;
using PostSharp.Patterns.Diagnostics.Backends.Log4Net;
using PostSharp.Extensibility;

[assembly: Log(
    AttributePriority = 1,
    AttributeTargetMemberAttributes = MulticastAttributes.Protected | MulticastAttributes.Internal | MulticastAttributes.Public
)]
[assembly: Log(
    AttributePriority = 2,
    AttributeExclude = true,
    AttributeTargetMembers = "get_*"
)]

class AspectInitialiser
{
    public void Initialise()
    {
        LoggingServices.DefaultBackend = new Log4NetLoggingBackend();
    }
}

由于代码在 .NET Framework 4.0 项目中具有 async 方法,因此代码无法编译并给出以下错误消息。

Applying aspects to async state machine is not supported for the current target framework. Please set ApplyToStateMachine property to false when applying an aspect to an async method.

很好,但是这个 ApplyToStateMachine 属性 在哪里?我能找到的唯一文档假设我知道 属性 已经在哪里。

我收到了 PostSharp 的官方回复,解决了这个问题。


您好,

我了解到,在您的项目中,您正在使用 Microsoft.Bcl.Async 包,该包在 .NET Framework 4.0 中提供异步支持。 Microsoft.Bcl.Async 包不受 PostSharp 支持,因此无法在此配置中处理异步方法。不幸的是,我们发出的错误消息非常普遍,必须加以改进 - 特别是 LogAttribute 根本没有暴露 ApplyToStateMachine 属性。

作为解决方法,您可以通过创建自己的派生 class 并覆盖 CompileTimeValidate 方法来完全禁用异步方法上的 LogAttribute。下面的示例演示了这种方法。

public class MyLogAttribute : LogAttribute
{
    public override bool CompileTimeValidate(MethodBase method)
    {
        // C# compiler marks async methods with AsyncStateMachineAttribute
        if (method.GetCustomAttributes(typeof(AsyncStateMachineAttribute), false).Length > 0)
            return false;

        return true;
    }
}

-亚历克斯