Windows服务的Inno安装程序?


105

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

基本上,它必须执行以下操作:

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

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

installutil.exe /u MyService.exe

如何使用Inno Setup进行这些操作?


我认为您需要使用[运行]部分。看到这里
Preet Sangha

Answers:


233

您不需要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"

3
你可以试试看Filename: "net.exe"; Parameters: "start WinServ"。如果不起作用,则可以再添加一个开关--start到c#应用程序,然后使用ServiceController类(msdn.microsoft.com/en-us/library/…)从程序直接启动Windows服务。
lubos hasko 09年


7
对于C#新手(像我一样),你要么需要添加using System.Reflection;或更改Assembly,以System.Reflection.Assembly在上面的代码。
rlandster 2011年

1
InstallUtil是点网框架的一部分,您不需要“权利”即可重新分发它,它已经存在于目标系统中(假设您当然可以在第一时间运行您的应用程序)
Andrew Savinykh 2014年

10
来自4.5中有关InstallHelper方法的文档-“此API支持.NET Framework基础结构,不能直接在您的代码中使用。” 在收到System.InvalidOperationException之后发现。
2014年

8

这是我的做法:

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

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

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

更多信息请点击这里


5

您可以使用

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.