.Net Windows サービスのインストール中に、イベント ソースを確実に作成/削除することが困難です。
ProjectInstaller クラスのコードは次のとおりです。
// Create Process Installer
ServiceProcessInstaller spi = new ServiceProcessInstaller();
spi.Account = ServiceAccount.LocalSystem;
// Create Service
ServiceInstaller si = new ServiceInstaller();
si.ServiceName = Facade.GetServiceName();
si.Description = "Processes ...";
si.DisplayName = "Auto Checkout";
si.StartType = ServiceStartMode.Automatic;
// Remove Event Source if already there
if (EventLog.SourceExists("AutoCheckout"))
EventLog.DeleteEventSource("AutoCheckout");
// Create Event Source and Event Log
EventLogInstaller log = new EventLogInstaller();
log.Source = "AutoCheckout";
log.Log = "AutoCheckoutLog";
Installers.AddRange(new Installer[] { spi, si, log });
参照されているファサード メソッドは、ログ、サービスなどの名前の文字列を返すだけです。
このコードはほとんどの場合機能しますが、最近インストールした後、ログ エントリがカスタム ログではなくアプリケーション ログに表示されるようになりました。また、次のエラーもログに記録されています。
ソース ( AutoCheckout ) のイベント ID ( 0 ) の説明が見つかりません。ローカル コンピュータに、リモート コンピュータからのメッセージを表示するために必要なレジストリ情報またはメッセージ DLL ファイルがない可能性があります。/AUXSOURCE= フラグを使用して、この説明を取得できる場合があります。詳細については、ヘルプとサポートを参照してください。
何らかの理由で、アンインストール中にソースが適切に削除されていないか、インストール中にソースが作成されていません。
ここでのベスト プラクティスに関するヘルプは大歓迎です。
ありがとう!
さらに、ログに例外を書き込む方法のサンプルを次に示します。
// Write to Log
EventLog.WriteEntry(Facade.GetEventLogSource(), errorDetails, EventLogEntryType.Error, 99);
stephbu の回答について:推奨されるパスは、インストーラー スクリプトと installutil、または Windows セットアップ ルーチンです。
サービスのインストールを実行し、ログを設定するセットアップ プロジェクトを使用しています。installutil.exe を使用するか、Windows セットアップ プロジェクトを使用するかに関係なく、どちらも上に示した同じ ProjectInstaller クラスを呼び出すと思います。
再起動するまでログが完全に削除されない場合、テスト マシンの状態がどのようにエラーを引き起こしているかがわかります。それが問題を解決するかどうかを確認するために、さらに実験します。
編集: サービスのインストール中にソースとログ名を登録する確実な方法に興味があります。そのため、サービスが以前にインストールされていた場合は、ソースが削除されるか、以降のインストール時にソースが再利用されます。
そのルートを試すために WiX を学ぶ機会はまだありません。