アプリ ドメインを作成して開始するサービスがあります。
this._appDomain = AppDomain.CreateDomain(this._appName, AppDomain.CurrentDomain.Evidence, appDomainSetup);
this._startStopControllerToRun = (IStartStop)this._appDomain.CreateInstanceFromAndUnwrap(assemblyName, this._fullyQualifiedClassName);
this._startStopControllerToRun.Start();
それは長い間うまくいっています。問題は、このアプリ ドメイン内で開始されたコントローラーが、フレームワークのログ クラスを呼び出すときです。ロガーはエントリ アセンブリ名を取得し、それをソースとしてイベント ログに記録します。これは、ロガーがソース (呼び出し元) 名を取得する方法です。
private static string GetSource()
{
try
{
var assembly = Assembly.GetEntryAssembly();
// GetEntryAssembly() can return null when called in the context of a unit test project.
// That can also happen when called from an app hosted in IIS, or even a windows service.
if (assembly == null)
{
// From http://stackoverflow.com/a/14165787/279516:
assembly = new StackTrace().GetFrames().Last().GetMethod().Module.Assembly;
}
return assembly.GetName().Name;
}
catch
{
return "Unknown";
}
}
そのチェックを追加する前if
に、ロガーはソースに対して「不明」を記録します。いくつかの調査の後、その試みをif
ブロックに追加しました。これで、ロガーは "mscorlib" をソース (エントリ アセンブリ名) として記録します。
これは概要です: ホスト -> コントローラー (アプリ ドメイン内で実行)
ドメイン内で実行されているアセンブリ (コントローラーを含む) の名前を取得するにはどうすればよいですか?
注:これも試しました(以下)が、ロギングクラスが存在するフレームワークの名前が表示されます(アプリドメイン内でコントローラーが実行されているアセンブリの名前ではありません):
assembly = Assembly.GetExecutingAssembly();