【问题标题】:PostSharp OnMethodBoundaryAspect OnEntry Not ExecutingPostSharp OnMethodBoundaryAspect OnEntry 未执行
【发布时间】:2011-09-16 17:03:51
【问题描述】:

我正在运行 .NET 4.0 Web 应用程序(不是网站)和 PostSharp 1.5。我无法使用 OnMethodBoundaryAspect 基类执行 OnEntry 覆盖方法。以下是一些相关代码:

public sealed class MonitorAttribute : OnMethodBoundaryAspect {

    public string[] SomeValue { get; protected set; }         

    public MonitorAttribute (params string[] someValue){
        SomeValue = someValue;
    }

    public override void OnEntry(MethodExecutionEventArgs eventArgs){
        // do Something here
        base.OnEntry(eventArgs);
    }

}

public sealed class MyUsageClass : IMyUsageClass {

    [Monitor(new string[]{ 'Test' })
    public void SomeMethod {
        // Do something else in here
    }        

}

我错过了什么吗?它永远不会命中 OnEntry 方法。我还尝试用新的 2.0 版本替换我的 PostSharp.dll 和 PostSharp.Laos.dll 依赖项。如果有什么不同,MyUsageClass 会被 StructureMap 实例化。

【问题讨论】:

  • 使用 ILSpy(或反射器)并在编译后检查您的方法。你的目标方法应该有一个 try/catch 包裹它,或者至少,在方法体的最顶部调用方面的 OnEntry 方法。
  • 非常酷。我现在正在下载 ILSpy.... 我会尽快回复。谢谢!
  • 好的。通过 ILSpy 查看方法,在方法主体的顶部没有看到对 OnEntry 的调用。
  • 那么我不太确定这方面是否已应用于您的方法。我会删除所有 postsharp isntlalations,下载最新的 postsharp,安装并重新引用它们,然后再试一次。你需要 1.5 是有原因的(也许是许可?)
  • 不,我继承了这个代码库,并且 PostSharp 已经被使用(显然不正确)。开发机器是否需要运行某种额外的插件/安装 postsharp 才能正确编译?

标签: c# .net-4.0 aop postsharp


【解决方案1】:

是的,每个开发人员都需要安装 PostSharp。如果您只是使用入门版,那么这一切都是免费的。

将此作为答案发布以向您展示代码。我的测试代码

class Program
    {
        [Monitor]
        static void Main(string[] args)
        {

        }
    }

    [Serializable]
    public class MonitorAttribute : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs args)
        {
            Console.WriteLine("OnEntry");
        }
    }

编译后的代码

internal class Program
    {
        [CompilerGenerated, DebuggerNonUserCode]
        internal sealed class <>z__Aspects
        {
            internal static MethodBase m1 = MethodBase.GetMethodFromHandle(ldtoken(Main()));
            internal static readonly MonitorAttribute a0 = (MonitorAttribute)<>z__AspectsImplementationDetails.aspects1[0];
        }
        private static void Main(string[] args)
        {
            Program.<>z__Aspects.a0.OnEntry(null);
        }
    }

【讨论】:

  • 好的,我只是在浏览 PostSharps 网站上的文档,看来我需要在我的机器上完整安装 PostSharp。感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多