Inno Setup for Windows服务?
我有一个.Net Windows服务。 我想创build一个安装程序来安装该Windows服务。
基本上,它必须做到以下几点:
- 安装包
installutil.exe
(是否需要?) - 运行
installutil.exe
MyService.exe - 启动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上做到这一点