Inno Setup for Windows服务?

我有一个.Net Windows服务。 我想创build一个安装程序来安装该Windows服务。

基本上,它必须做到以下几点:

  1. 安装包installutil.exe (是否需要?)
  2. 运行installutil.exe MyService.exe
  3. 启动MyService

另外,我想提供一个运行以下命令的卸载程序:

 installutil.exe /u MyService.exe 

如何使用Inno Setup来做到这些?

你不需要installutil.exe ,甚至你甚至没有权利重新分配它。

这是我在我的应用程序中的方式:

 using System; using System.Collections.Generic; using System.Configuration.Install; using System.IO; using System.Linq; using System.Reflection; using System.ServiceProcess; using System.Text; static void Main(string[] args) { if (System.Environment.UserInteractive) { string parameter = string.Concat(args); switch (parameter) { case "--install": ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); break; case "--uninstall": ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); break; } } else { ServiceBase.Run(new WindowsService()); } } 

基本上你可以通过使用ManagedInstallerClass自己安装/卸载服务,如我的示例所示。

那么这只是添加到你的InnoSetup脚本的事情是这样的:

 [Run] Filename: "{app}\MYSERVICE.EXE"; Parameters: "--install" [UninstallRun] Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall" 

我是这么做的:

 Exec(ExpandConstant('{dotnet40}\InstallUtil.exe'), ServiceLocation, '', SW_HIDE, ewWaitUntilTerminated, ResultCode); 

显然,Inno安装程序具有以下常量用于引用系统上的.NET文件夹:

  • {} dotnet11
  • {} dotnet20
  • {} dotnet2032
  • {} dotnet2064
  • {} dotnet40
  • {} dotnet4032
  • {} dotnet4064

更多信息在这里 。

您可以使用

 Exec( ExpandConstant('{sys}\sc.exe'), ExpandConstant('create "MyService" binPath= {app}\MyService.exe start= auto DisplayName= "My Service" obj= LocalSystem'), '', SW_HIDE, ewWaitUntilTerminated, ResultCode ) 

创build一个服务。 有关如何启动,停止,检查服务状态,删除服务等信息,请参阅“ sc.exe ”。

如果你想避免在用户升级时重启,那么你需要在复制exe之前停止服务,然后重新启动。

有一些脚本函数可以在服务 – 启动,停止,安装,删除服务的function上做到这一点