我第一次使用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
属性在哪里?我能找到的唯一文件假设我知道该物业的位置。
答案 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