log4net.Util.SystemInfo bug? (その3)
その後、本当にLog4netのバグなのかをいろいろなテストケースで調べていたのだが、Log4netには問題が無いことが判明した。
そもそもの問題はlog4net.Util.SystemInfo#ConvertToFullPathメソッドに拡張子を含むアセンブリへのフルパスが渡ると不正なパスを返す事だったが、不正なパスを渡していたのはlog4net中のコードではなく、起動するアプリケーションドメインをセットアップする、アプリケーション側のコードだった。
AppDomainを生成するコードでは、セットアップパラメタとしてAppDomainSetupクラスのインスタンスを使用するのだが、その中のプロパティ"ApplicationBase"に、不正な値がセットされていたのがそもそも想定外。
AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = serverPath; setup.PrivateBinPath = serverPath + "\\bin"; 〜中略〜 AppDomain appDomain = AppDomain.CreateDomain(domainName, evidence, setup);
標題のクラスはパスを合成する時のベースディレクトリを、AppDomain.CurrentDomain.BaseDirectoryから取得しているのだが、上記のコードのserverPathが、もろこのプロパティに影響するのだ。従って、変数 serverPathに"c:\app\server.exe"等と、拡張子を含んだアセンブリのフルパスをセットとしてしまうと、それはそのままLog4netのアペンダのベースディレクトリとしてセットされてしまうので、アペンダはファイルの保存に失敗する。
過去のこのエントリでは、まるでLog4netに問題があるかのような書き方をしましが、悪いのはアプリケーション側のコードでした。謹んでお詫びいたします。