皆さん、こんにちは。
Reza Ahmadi http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostSおよび dnrTV http: //dnrtv.com/dnrtvplayer/player.aspx?ShowNum=0190で例外処理を行います。「OnExceptionAspect」が同じプロジェクト/アセンブリにある場合はすべて正常に機能しますが、クラスを独自の dll に移動するとイベントは機能しません。
[assembly: ExceptionAspect (AttributePriority = 1)]
[assembly: ExceptionAspect(AttributePriority = 2, AttributeExclude = true, AttributeTargetTypes = "HpsErp.Common.AspectObject.*")]
namespace AspectObject
[Serializable]
public class ExceptionAspect : OnExceptionAspect
{
public override void OnException(MethodExecutionArgs args)
{
Trace.TraceError("{0} in {1}.{2}",
args.Exception.GetType().Name,
args.Method.DeclaringType.FullName,
args.Method.Name);
if (args.Instance != null)
{
Trace.TraceInformation("this={0}", args.Instance);
}
foreach (ParameterInfo parameter in args.Method.GetParameters())
{
Trace.TraceInformation("{0}={1}", parameter.Name,
args.Arguments[parameter.Position] ?? "null");
}
}
また、「タイミング」用の外部 dll にクラスを作成しました。クラスにカスタム属性を追加すると、うまく機能します。
namespace AspectObject
[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method)]
public class TimingAspect : OnMethodBoundaryAspect
{
[NonSerialized]
Stopwatch _StopWatch;
public override void OnEntry(MethodExecutionArgs args)
{
_StopWatch = Stopwatch.StartNew();
base.OnEntry(args);
}
public override void OnExit(MethodExecutionArgs args)
{
Console.WriteLine(string.Format("[{0}] took {1}ms to execute",
new StackTrace().GetFrame(1).GetMethod().Name,
_StopWatch.ElapsedMilliseconds));
base.OnExit(args);
}
Using AspectObject;
namespace MyApp
{
public class Car
{
[TimingAspect]
private void Drive()
{
//...
}
}
}
最後に、これを再利用できるようにマルチ DLL にすることを望んでいます。つまり、wcf.
助けてくれてありがとう...
ジェームズ