方面的 PostSharp stackoverflow
PostSharp stackoverflow on aspect
方面 class 看起来像这样:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using PostSharp.Aspects;
namespace GlobalExceptionHandler
{
[Serializable]
class MyDebugger : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
Console.WriteLine("METHOD ENTRY: " + args.Method.Name + "(" + args.Arguments.GetArgument(0) + ")");
}
public override void OnException(MethodExecutionArgs args)
{
Console.WriteLine("Exception at: " + args.Method.Name + "()");
args.FlowBehavior = FlowBehavior.Continue;
}
}
}
我正在将方面应用到 mscorlib 程序集到系统命名空间,但不包括控制台 class,我认为它导致了我方面的堆栈溢出,因为它使用 Console.WriteLine 打印日志。
[assembly: GlobalExceptionHandler.MyDebugger(AttributeTargetAssemblies = "mscorlib", AttributeTargetTypes = "System.Console", AttributeExclude = true, AttributePriority = 100000)]
[assembly: GlobalExceptionHandler.MyDebugger(AttributeTargetAssemblies = "mscorlib", AttributeTargetTypes = "System.*")]
而且我仍然收到 Whosebug 异常
方面代码中使用“+”添加多个字符串的表达式实际上是由 C# 编译器作为对 String.Concat
方法的调用发出的。所以你在 OnEntry
:
中得到这段代码
Console.WriteLine(String.Concat("METHOD ENTRY: ", args.Method.Name, "(", args.Arguments.GetArgument(0), ")"));
为了避免递归,您可以像排除 System.Console
一样排除 System.String
class。但是,在一般情况下,最好向您的方面添加一个 thread-static 标志,以停止递归调用。
[Serializable]
class MyDebugger : OnMethodBoundaryAspect
{
[ThreadStatic]
private static bool isLogging;
public override void OnEntry( MethodExecutionArgs args )
{
if ( isLogging ) return;
isLogging = true;
Console.WriteLine( "METHOD ENTRY: " + args.Method.Name + "(" + args.Arguments.GetArgument( 0 ) + ")" );
isLogging = false;
}
public override void OnException( MethodExecutionArgs args )
{
if ( isLogging ) return;
isLogging = true;
Console.WriteLine( "Exception at: " + args.Method.Name + "()" );
args.FlowBehavior = FlowBehavior.Continue;
isLogging = false;
}
}
方面 class 看起来像这样:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using PostSharp.Aspects;
namespace GlobalExceptionHandler
{
[Serializable]
class MyDebugger : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
Console.WriteLine("METHOD ENTRY: " + args.Method.Name + "(" + args.Arguments.GetArgument(0) + ")");
}
public override void OnException(MethodExecutionArgs args)
{
Console.WriteLine("Exception at: " + args.Method.Name + "()");
args.FlowBehavior = FlowBehavior.Continue;
}
}
}
我正在将方面应用到 mscorlib 程序集到系统命名空间,但不包括控制台 class,我认为它导致了我方面的堆栈溢出,因为它使用 Console.WriteLine 打印日志。
[assembly: GlobalExceptionHandler.MyDebugger(AttributeTargetAssemblies = "mscorlib", AttributeTargetTypes = "System.Console", AttributeExclude = true, AttributePriority = 100000)]
[assembly: GlobalExceptionHandler.MyDebugger(AttributeTargetAssemblies = "mscorlib", AttributeTargetTypes = "System.*")]
而且我仍然收到 Whosebug 异常
方面代码中使用“+”添加多个字符串的表达式实际上是由 C# 编译器作为对 String.Concat
方法的调用发出的。所以你在 OnEntry
:
Console.WriteLine(String.Concat("METHOD ENTRY: ", args.Method.Name, "(", args.Arguments.GetArgument(0), ")"));
为了避免递归,您可以像排除 System.Console
一样排除 System.String
class。但是,在一般情况下,最好向您的方面添加一个 thread-static 标志,以停止递归调用。
[Serializable]
class MyDebugger : OnMethodBoundaryAspect
{
[ThreadStatic]
private static bool isLogging;
public override void OnEntry( MethodExecutionArgs args )
{
if ( isLogging ) return;
isLogging = true;
Console.WriteLine( "METHOD ENTRY: " + args.Method.Name + "(" + args.Arguments.GetArgument( 0 ) + ")" );
isLogging = false;
}
public override void OnException( MethodExecutionArgs args )
{
if ( isLogging ) return;
isLogging = true;
Console.WriteLine( "Exception at: " + args.Method.Name + "()" );
args.FlowBehavior = FlowBehavior.Continue;
isLogging = false;
}
}