HI,
我正在使用PostSharp来记录入口并退出到我的Application程序集中的每个方法。该程序集在GAC中进行了强有力的命名,版本化和注册。
然后由IIS内的单独虚拟目录中托管的2个Web服务项目共享。当WebServiceProject1调用拦截器的OnEntry / OnExit方法时,它工作正常,但是当它们被WebServiceProject2调用时,传递给拦截器的MethodExecutionEventArgs.Method值似乎为null,我得到NullReferenceException。
如果重新启动IIS并按WebServiceProject2,WebServiceProject1的顺序调用Web服务项目,那么第一个调用的工作将再次运行,另一个以相同的方式抛出NullReferenceException。代码如下所示:
[Serializable]
[Log(AttributeExclude = true)]
[AttributeUsage(AttributeTargets.All)]
public sealed class LogAttribute : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionEventArgs eventArgs)
{
IoC.Resolve<ILogger>().WriteMethodEntry(eventArgs.Method, eventArgs.GetReadOnlyArgumentArray());
}
public override void OnExit(MethodExecutionEventArgs eventArgs)
{
IoC.Resolve<ILogger>().WriteMethodExit(eventArgs.Method, eventArgs.ReturnValue);
}
}
有趣的是,如果我从GAC中删除程序集并使web服务项目从\ bin子目录副本运行,它可以正常工作。我不想这样做,因为应用程序的另一部分依赖于GAC中的程序集,我不希望在不同的地方有很多不同版本的相同DLL。
它类似于此处描述的问题:http://generatedbyatool.net/content/post/2009/07/27/PostSharp-Bug-or-How-To-Recycle-Your-Own-App-Pool.aspx但存在明显的差异。
有人有任何想法或建议吗?我今天将尝试构建一个独立的应用程序来证明这一点。
STOO
答案 0 :(得分:0)
您可以向http://www.postsharp.org/tracker报告此问题吗?
请注意,要处理的程序集在GAC中时存在已知问题。当PostSharp处理它时,程序集不得位于GAC(即使是旧版本,如果它具有相同的版本号)。您应该在预构建步骤中将其删除。
但是,如果PostSharp正常运行,我认为没有理由不传递该方法。您是否试图在Reflector中看到会发生什么?
-gael