5

Windows Serviceとして実行したいアプリケーションがあります。この MSDN doc ページ( WCFサービスをホストする必要があるため、手順ではこの部分についても詳しく説明しています) に記載されている手順に従って、それを行うことができ、サンプル サービスを実装すれば問題ありません。ユーティリティを使用installutil.exeして、アプリケーションを Windows サービスとしてインストールおよびアンインストールできます。

私の問題

ただし、ローカル マシンに同じアプリケーションのサービスをさらにインストールする必要があります。だから私はそれらに異なる s を与える必要がありますSystem.ServiceProcess.ServiceBase.ServiceName! したがって、インストール コードをもう一度検討してください。

[RunInstaller(true)]
public class ProjectInstaller : Installer {
    private ServiceProcessInstaller process;
    private ServiceInstaller service;

    public ProjectInstaller() {
        process = new ServiceProcessInstaller();
        process.Account = ServiceAccount.LocalSystem;
        service = new ServiceInstaller();
        service.ServiceName = /* NEED TO PUT HERE THE NAME!!! */;
        Installers.Add(process);
        Installers.Add(service);
    }
}

呼び出すときにサービスの名前を渡す方法はありinstallutil.exeますか? この問題にどのようにアプローチしますか?App.Configまた、ファイルを使用して、次のようなことを試みました。

public ProjectInstaller() {
    process = new ServiceProcessInstaller();
    process.Account = ServiceAccount.LocalSystem;
    service = new ServiceInstaller();
    service.ServiceName = System.Configuration.ConfigurationManager.
        AppSettings["SrvName"];
    Installers.Add(process);
    Installers.Add(service);
}

しかし、もちろんうまくいきませんでした。このファイルは、アプリケーションの実行時に呼び出されます!!!

4

2 に答える 2

3

アセンブリを実行するための構成ファイルを開くことができます。インストーラー コードがメイン サービスの exe ファイルに配置されている場合、それは app.config になります。それ以外の場合は、構成ファイルに [assemblyname].dll.config という名前を付ける必要があります。

process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = new ServiceInstaller();

var path = Assembly.GetExecutingAssembly().Location;
var config = ConfigurationManager.OpenExeConfiguration(path);
service.ServiceName = config.AppSettings.Settings["ServiceName"];
Installers.Add(process);
Installers.Add(service);

また、この記事では、コマンド ラインから installutil パラメーターを明示的に渡す方法についても説明します。

于 2013-05-27T08:37:17.373 に答える
2

この問題に直面して、私は最初にここでアプローチを使用しました:

しかし、その後、さまざまな量のプロセスを起動する単一のサービスを持つアーキテクチャに戻りました (私の場合、実行するプロセスの数とそのコマンド ライン引数を設定するために Zookeeper を使用しますが、それが単なる問題である場合インスタンスの数、問題ありapp.configません)。

そのようにして私が見つけた主な利点は、起動サービスが実行中のサブプロセスを監視し、たとえば、クラッシュした場合にサブプロセスを再起動できることです。

于 2013-05-27T08:24:33.957 に答える