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.