如何设置ApplyToStateMachine?

时间:2017-10-25 01:00:19

标签: c# .net-4.0 async-await postsharp

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

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方法,代码将无法编译,从而显示以下错误消息。

  

当前目标框架不支持将方面应用于异步状态机。将方面应用于异步方法时,请将ApplyToStateMachine属性设置为false。

没关系,但这个ApplyToStateMachine属性在哪里?我能找到的唯一文件假设我知道该物业的位置。

1 个答案:

答案 0 :(得分:1)

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

您好,

我了解在您的项目中,您使用的Microsoft.Bcl.Async包在.NET Framework 4.0中提供了对异步的支持。 PostSharp不支持Microsoft.Bcl.Async包,因此在此配置中无法处理异步方法。遗憾的是,我们发出的错误消息非常笼统,必须进行改进 - LogAttribute根本不会公开ApplyToStateMachine属性。

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

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;
    }
}

-Alex