0

我正在使用 PostSharp 记录应用程序程序集中每个方法的进入和退出。此程序集在 GAC 中进行了严格命名、版本控制和注册。

然后由 IIS 内不同虚拟目录中托管的 2 个 Web 服务项目共享。当 WebServiceProject1 调用拦截器的 OnEntry/OnExit 方法时,它工作正常,但是当它们被 WebServiceProject2 调用时,传递给拦截器的 MethodExecutionEventArgs.Method 值似乎为空,我得到一个 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但那里是明显的区别。

今天我将尝试构建一个独立的应用程序来证明这一点。

4

1 回答 1

0

您能否将此问题报告给http://www.postsharp.org/tracker

请注意,当要处理的程序集在 GAC 中时,存在已知问题。当 PostSharp 处理它时,程序集不得在 GAC 中(即使是旧版本,如果它具有相同的版本号)。您应该在预构建步骤中将其删除。

但是,如果 PostSharp 运行正常,我看不出该方法没有通过的原因。您是否尝试在 Reflector 中查看会发生什么?

于 2009-11-11T20:18:08.870 回答