PostSharp を使用して、アプリケーション アセンブリ内のすべてのメソッドのエントリと終了をログに記録しています。このアセンブリは厳密に名前が付けられ、バージョン管理され、GAC に登録されています。
次に、IIS 内の別々の仮想ディレクトリでホストされている 2 つの Web サービス プロジェクトによって共有されます。インターセプターの OnEntry/OnExit メソッドが WebServiceProject1 によって呼び出されると正常に動作しますが、WebServiceProject2 によって呼び出されると、インターセプターに渡される MethodExecutionEventArgs.Method 値が null のように見え、NullReferenceException が発生します。
IIS を再起動し、WebServiceProject2、WebServiceProject1 の順序で Web サービス プロジェクトを呼び出すと、最初に呼び出したプロジェクトが機能し、もう 1 つのプロジェクトが同じ方法で 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しかし、は明らかな違いです。
今日は、これを証明するためにスタンドアロン アプリケーションを作成してみます。