Windowsサービスとイベントログのセットアッププロジェクト
-
28-10-2019 - |
質問
Windowsサービスをインストールするセットアッププロジェクトを受け取りました。
WinServiceプロジェクトで使用する必要があるカスタムログにイベントログソースを登録しています(どのように、なぜ重要ではないか)。
私の問題は、セットアッププロジェクトがデフォルトごとにイベントログソースを作成しようとすることです。そうすることで、エラーメッセージが表示されます("Error 1001" source XXX already exists on local computer
)そしてロールバック。
私はどこにでも見てきましたが、登録がどこで行われているのか、どのようにオフにできるかを見つけることができません。
Windowsサービスまたはセットアッププロジェクトにイベントログソースを作成しないように強制するにはどうすればよいですか?
解決
デフォルトを削除できます EventLogInstaller
:
namespace MyService
{
[RunInstaller(true)]
public partial class ProjectInstaller : Installer
{
public ProjectInstaller()
{
InitializeComponent();
// Remove the default Event Log Installer
EventLogInstaller DefaultInstaller = null;
foreach (Installer installer in serviceInstaller1.Installers)
{
if (installer is EventLogInstaller)
{
DefaultInstaller = (EventLogInstaller)installer;
break;
}
}
if (DefaultInstaller != null)
{
serviceInstaller1.Installers.Remove(DefaultInstaller);
}
}
}
}
または、変更することもできます Log
財産:
foreach (Installer installer in serviceInstaller1.Installers)
{
if (installer is EventLogInstaller)
{
((EventLogInstaller)installer).Log = "MyLog";
break;
}
}
これで、イベントが正常にログインされます mylog, 、およびサービスの開始/停止イベントは引き続きログインします 応用 ログ。
他のヒント
サービスをアンインストールすると、イベントログに特に何かが正しくアンインストールされていないと思います。
再度サービスを再インストールする機能を復元するために、私は発見しました(この記事に感謝します)レジストリでこのキーを削除する必要があります(regedit.exe):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\YOURSERVICENAME
これは私のテストに基づいた推測にすぎません。
インストーラープロジェクト(またはWindowserviceクラス)は、同じ名前と同じ名前で自動的にイベントソースを作成します myService.ServiceName
. 。これは、サービスが開始 /停止されるたびに、開始 /停止メッセージがログに書き込まれるためです。そして、それらのメッセージにはソースが必要です。
言い換えれば、ServicEnameと同じ名前のソースを作成する必要はありません。