Windowsサービスのインストール名を構成可能にする

1852 ワード

場合によっては、Windowsサービスはフレームワークであり、同じサーバ上で異なるシステムにサービスする可能性があります.サービス名が競合しないように、サービス名を構成可能に変更する必要があります.ServiceInstallerはインストールサービスの名前と説明を直接設定できるので、次のコードを簡単に書くことができます.
serviceInstaller.ServiceName = ConfigurationManager.AppSetting["ServiceName"];

serviceInstaller.Description = ConfigurationManager.AppSetting["ServiceDescription"];

コンパイル実行インストールは、残念ながら異常が投げ出され、インストールに失敗しました.
失敗した理由は、インストールサービスを実行するプログラムがInstallUtil.exeであり、インストール段階ではサービスのapp.configプロファイルが自動的にロードされず、グローバルなmachine.configのみがロードされ、手動でapp.configをロードして読み込むように変更する必要があるためです.解決策を特定した後、次のコードを書きました.
var targetDirectory = AppDomain.CurrentDomain.BaseDirectory;

var configPath = Path.Combine(targetDirectory, "Service.exe");

var config = ConfigurationManager.OpenExeConfiguration(configPath);

serviceInstaller.ServiceName = config.AppSettings.Settings["ServiceName"].Value;

serviceInstaller.Description = config.AppSettings.Settings["ServiceDescription"].Value;

再度コンパイルして実行して、本机の上でインストールに成功したことを発见します:)、全体のプログラムのパッケージは别の同僚に任せてサーバーの上でインストールして、インストールの过程がまた间违っていることを発见します.の過去に見て、エラーの原因は、本機のインストール時、InstallUtilプログラムはサービスと同じディレクトリに置かれていたのに対し、サーバー上のInstallUtilはサービスとは別のディレクトリに置かれていたからです.AppDomain.CurrentDomain.BaseDirectoryは、サービスではなくInstallUtilのアプリケーションドメインディレクトリパスを取得しているようです.その後、反射を使用してこの問題を解決しました.コードは次のとおりです.
var path = System.Reflection.Assembly.GetExecutingAssembly().Location;

var targetDirectory = System.IO.Path.GetDirectoryName(path);

var configPath = Path.Combine(targetDirectory, "Service.exe");

var config = ConfigurationManager.OpenExeConfiguration(configPath);

serviceInstaller.ServiceName = config.AppSettings.Settings["ServiceName"].Value;

serviceInstaller.Description = config.AppSettings.Settings["ServiceDescription"].Value;