web-dev-qa-db-ja.com

インストール時に(またはコンパイル時に簡単に)Windowsサービスの名前を構成するにはどうすればよいですか?

C#でWindowsサービスを作成し、サーバーにインストールしましたが、正常に実行されています。

ここで、同じサービスを再度インストールしますが、別の作業ディレクトリから実行し、別の構成ファイルなどを使用します。したがって、同じサービスの2(またはそれ以上)のインスタンスを実行したいと思います。同時に。インストーラーは、指定された名前のサービスが既にインストールされていると文句を言うため、最初はこれは不可能です。

コードを変更し、ServiceBase.ServiceNameプロパティを新しい値に設定してから、InstallUtil.exeを再コンパイルして再度実行することで、これを克服できます。ただし、インストール時にサービス名を設定できるといいのですが、理想的には次のようなことをします。

InstallUtil.exe/i/servicename = "MyService Instance 2" MyService.exe

これが達成できない場合(私はそれを非常に疑っています)、サービスを構築するときにサービス名を挿入できるようにしたいと思います。ある種のビルドイベントを使用したり、巧妙なmsbuildやnantトリックなどを使用したりすることは可能かもしれないと思いましたが、手がかりがありません。

任意の提案をいただければ幸いです。

お時間をいただきありがとうございます。

22
Rune

を使用して構成にアクセスしてみました

_ConfigurationManager.OpenExeConfiguration(string exePath)
_

インストーラーで、しかしそれを動作させることができませんでした。

代わりに、次のようにインストーラーでSystem.Environment.GetCommandLineArgs()を使用することにしました。

_string[] commandlineArgs = Environment.GetCommandLineArgs();

string servicename;
string servicedisplayname;
ParseServiceNameSwitches(
    commandlineArgs, 
    out servicename, 
    out servicedisplayname);

serviceInstaller.ServiceName = servicename;
serviceInstaller.DisplayName = servicedisplayname;
_

これで、を使用してサービスをインストールできます

InstallUtil.exe/i InstallableService.dll/servicename = "myserviceinstance_2"/servicedisplayname = "My Service Instance 2"

もっと詳しい説明を書きました ここ

29
Rune

InstallUtilはそのための適切なフックを提供しないため、これをコマンドライン引数として渡すことはできません。

ただし、サービスインストーラーに構成ファイルからServiceNameを読み取らせることができます。 いくつかのコードを見てください 典型的なServiceInstallerの場合、実行時に適切なDisplayNameプロパティとServiceNameプロパティを設定するだけでよいことがわかります。これらは、ハードコーディングする代わりに、構成ファイルから簡単に読み取ることができます。

4
Reed Copsey

Environment.GetCommandLineArgs();を使用する代わりに、クラスInstallerにはContextというプロパティがあり、そこから、Nice StringDictionaryで構造化されたInstallUtilに渡されるコマンドライン引数にアクセスできます。

2
Arthur Rizzo