[英]How to pass arguments to `Configuration.Install.Installer` when installing a long-running service through `installutil`
我有一個要作為Windows Service運行的應用程序。 遵循此MSDN文檔頁面中提供的說明(我需要托管WCF服務,因此該過程還將詳細介紹此部分),我可以做到這一點,並且如果實現示例服務也可以。 我使用installutil.exe
實用程序,可以將其應用程序安裝和卸載為Windows服務。
但是,我需要在本地計算機上安裝同一應用程序的更多服務。 所以我需要給他們不同的System.ServiceProcess.ServiceBase.ServiceName
s! 因此,請再次考慮安裝代碼:
[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);
}
但是當然它不起作用,當應用程序運行時將調用該文件!!!
您可以打開配置文件以執行程序集。 如果您的安裝程序代碼放置在主服務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參數 。
面對這個問題,我首先在這里使用了這種方法:
但是,然后我又切換回一種架構,在該架構中,我只有一個服務來啟動可變數量的進程(在我的情況下,我使用zookeeper設置要運行的進程數及其命令行參數,但是如果這僅僅是一個問題的話)實例數, app.config
很好)。
我以這種方式發現的主要優點是,啟動服務可以監視正在運行的子進程,例如,如果崩潰了,則可以重新啟動它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.