Inno Setup for Windowsサービス?


105

.Net Windowsサービスを利用しています。そのWindowsサービスをインストールするインストーラーを作成したいと思います。

基本的には、次のことを行う必要があります。

  1. パックinstallutil.exe(必要ですか?)
  2. installutil.exeMyService.exeを実行します。
  3. MyServiceを開始する

また、次のコマンドを実行するアンインストーラーを提供したいと思います。

installutil.exe /u MyService.exe

Inno Setupを使用してこれらを行う方法?


[Run]セクションを使用する必要があると思います。ここを
プリートサンガ09/09/20

回答:


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"。それが機能しない場合は、c#アプリケーションにもう1つのスイッチ--startを追加し、ServiceControllerクラス(msdn.microsoft.com/en-us/library/…)を使用してプログラムから直接Windowsサービスを開始します。
lubos hasko 2009


7
C#の新生物(私のような)の場合、上記のコードにaを追加するusing System.Reflection;か、を変更Assemblyする必要がありますSystem.Reflection.Assembly
rlandster '10

1
InstallUtilはドットネットフレームワークの一部であり、再配布するための「権利」は必要ありません。ターゲットシステムにすでに存在しています(もちろん、最初からアプリを実行できる場合)
Andrew Savinykh

10
4.5のInstallHelperメソッドに関するドキュメントから-「このAPIは.NET Frameworkインフラストラクチャをサポートし、コードから直接使用するためのものではありません。」System.InvalidOperationExceptionの受信後に発見されました。
Bratch、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」を参照してください。


2

ユーザーがアップグレードする際の再起動を回避したい場合は、exeをコピーする前にサービスを停止し、その後再開する必要があります。

サービスでこれを行うためのいくつかのスクリプト関数があります-サービスを開始、停止、インストール、削除する関数


リンクされた記事では、使用された関数のプロトタイプが正確に翻訳されておらず、その使用法も正しくありません(たとえば、サービスの開始、停止などの待機がありません)。
TLama 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.