Inno Setup for Windows 서비스?


105

.Net Windows 서비스가 있습니다. 해당 Windows 서비스를 설치하기 위해 설치 프로그램을 만들고 싶습니다.

기본적으로 다음을 수행해야합니다.

  1. installutil.exe(필수입니까?)
  2. installutil.exeMyService.exe 실행
  3. MyService 시작

또한 다음 명령을 실행하는 제거 프로그램을 제공하고 싶습니다.

installutil.exe /u MyService.exe

Inno Setup을 사용하여 어떻게하나요?


[실행] 섹션을 사용해야한다고 생각합니다. 참조 여기
Preet 승가에게

답변:


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 # 응용 프로그램에 대한 시작 스위치를 하나 더 추가하고 ServiceController 클래스 ( msdn.microsoft.com/en-us/library/… )를 사용하여 프로그램에서 직접 Windows 서비스를 시작할 수 있습니다 .
lubos hasko


7
(나 같은)는 C #의 초보를 들어, 당신도 할 필요는 추가 using System.Reflection;또는 변경을 Assembly에게 System.Reflection.Assembly위의 코드에서.
rlandster

1
InstallUtil은 dot net 프레임 워크의 일부이며 재배포 할 "권한"이 필요하지 않습니다. 이미 대상 시스템에 존재합니다 (물론 처음에 앱을 실행할 수 있다고 가정)
Andrew Savinykh

10
4.5의 InstallHelper 메서드에 대한 설명서에서- "이 API는 .NET Framework 인프라를 지원하며 사용자 코드에서 직접 사용할 수 없습니다." System.InvalidOperationException을 수신 한 후 발견되었습니다.
Bratch 2014-06-09

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.