1

Webサービスを提供する単一のexeを展開し、それを複数回(それぞれ個別のWindowsサービスとして)開始できるようにしたい。exeの各インスタンスは、異なる構成ファイルをロードできる必要があります(たとえば、異なるポートでリッスンしたり、異なるデータベースを使用したりできるようにするため)。

理想的には、exeを複数のフォルダーにインストールする必要はなく、複数の構成ファイルを用意するだけです。

ただし、Windowsが開始しているサービス名を見つける方法はないようです。

WindowsサービスがそのServiceNameをどのように判別できるかを見てきました 。 しかし、起動時に開始されるサービスのプロセスIDが0であるため、私にはうまくいかないようです。

質問が早すぎるか何かだと思います。私のコードは次のことを行います。

Mainは現在のディレクトリを設定し、WebServiceオブジェクト(ServiceBaseのサブクラス)を構築します

WebServiceオブジェクトコンストラクターは、ServiceNameプロパティを設定する必要があり、WindowsサービスがServiceNameを判別する方法のコードを使用します。正しい名前を見つけようとします。ただし、この時点では、正しいサービス名のプロセスIDはまだ0です。

これに続いて、MainはWebServiceオブジェクトを含む(1)ServiceBaseの配列を構築し、その配列でServiceBase.Runを呼び出します。サービス名は、サービスの実行後に変更されない可能性があるため、この時点で正しい必要があります。

4

1 に答える 1

0

https://stackoverflow.com/a/7981644/862344を読んだ後、目標を達成するための別の方法を見つけました

Webサービスのインストール中に、インストールプログラム(たまたま同じプログラムですが、コマンドラインパラメーターが "install")は、使用する設定ファイルを認識しています(コマンドラインパラメーター "settings ="があるため)。 )。

リンクされた質問は、InstallerクラスのOnBeforeInstall(およびOnBeforeUninstall)メソッドをオーバーライドすることにより、サービスを開始するたびにそのコマンドラインパラメーターをサービスに渡す簡単な方法があることを示しています。

protected override void OnBeforeInstall(System.Collections.IDictionary savedState) {
    if (HasCommandParameter("settings")) {
        // NB: Framework will surround this value with quotes when storing in registry
        Context.Parameters["assemblypath"] += "\" \"settings=" + CommandParameter("settings");
    }
    base.OnBeforeInstall(savedState);
}

protected override void OnBeforeUninstall(System.Collections.IDictionary savedState) {
    if (HasCommandParameter("settings")) {
        // NB: Framework will surround this value with quotes when storing in registry
        Context.Parameters["assemblypath"] += "\" \"settings=" + CommandParameter("settings");
    }
    base.OnBeforeUninstall(savedState);
}

フレームワーク内の何かがContext.Parameters["assemblypath"]値を引用符で囲んでから、レジストリ(HKLM \ System \ CurrentControlSet \ Services \\ ImagePath )に格納することがわかったため、' ""を追加する必要があります。 '既存の値(exeパス)とパラメーターの間。

于 2012-08-08T10:13:58.780 に答える