Windowsサービスのインストール名を構成可能にする
1852 ワード
場合によっては、Windowsサービスはフレームワークであり、同じサーバ上で異なるシステムにサービスする可能性があります.サービス名が競合しないように、サービス名を構成可能に変更する必要があります.ServiceInstallerはインストールサービスの名前と説明を直接設定できるので、次のコードを簡単に書くことができます.
コンパイル実行インストールは、残念ながら異常が投げ出され、インストールに失敗しました.
失敗した理由は、インストールサービスを実行するプログラムがInstallUtil.exeであり、インストール段階ではサービスのapp.configプロファイルが自動的にロードされず、グローバルなmachine.configのみがロードされ、手動でapp.configをロードして読み込むように変更する必要があるためです.解決策を特定した後、次のコードを書きました.
再度コンパイルして実行して、本机の上でインストールに成功したことを発见します:)、全体のプログラムのパッケージは别の同僚に任せてサーバーの上でインストールして、インストールの过程がまた间违っていることを発见します.の過去に見て、エラーの原因は、本機のインストール時、InstallUtilプログラムはサービスと同じディレクトリに置かれていたのに対し、サーバー上のInstallUtilはサービスとは別のディレクトリに置かれていたからです.AppDomain.CurrentDomain.BaseDirectoryは、サービスではなくInstallUtilのアプリケーションドメインディレクトリパスを取得しているようです.その後、反射を使用してこの問題を解決しました.コードは次のとおりです.
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;