Inno Setup สำหรับบริการ Windows?


105

ฉันมีบริการ. Net Windows ฉันต้องการสร้างตัวติดตั้งเพื่อติดตั้งบริการ windows นั้น

โดยพื้นฐานแล้วจะต้องทำสิ่งต่อไปนี้:

  1. แพ็คinstallutil.exe(จำเป็นไหม)
  2. เรียกใช้installutil.exeMyService.exe
  3. เริ่ม MyService

นอกจากนี้ฉันต้องการให้โปรแกรมถอนการติดตั้งซึ่งรันคำสั่งต่อไปนี้:

installutil.exe /u MyService.exe

จะทำอย่างไรโดยใช้ Inno Setup?


ฉันคิดว่าคุณต้องใช้ส่วน [Run] ดูที่นี่
Preet Sangha

คำตอบ:


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 # ของคุณและเริ่มบริการ windows โดยตรงจากโปรแกรมโดยใช้คลาส ServiceController ( msdn.microsoft.com/en-us/library/… )
lubos hasko


7
สำหรับเณร C # (เช่นฉัน) คุณอาจจำเป็นต้องเพิ่มusing System.Reflection;หรือการเปลี่ยนแปลงAssemblyไปSystem.Reflection.Assemblyในรหัสดังกล่าวข้างต้น
rlandster

1
InstallUtil เป็นส่วนหนึ่งของ dot net framework คุณไม่จำเป็นต้องมี "สิทธิ์" ในการแจกจ่ายซ้ำมันมีอยู่ในระบบเป้าหมายของคุณแล้ว (สมมติว่าคุณสามารถเรียกใช้แอปของคุณได้ตั้งแต่แรกแน่นอน)
Andrew Savinykh

10
จากเอกสารเกี่ยวกับเมธอด InstallHelper ใน 4.5 - "API นี้รองรับโครงสร้างพื้นฐาน. NET Framework และไม่ได้ตั้งใจให้ใช้โดยตรงจากโค้ดของคุณ" ค้นพบหลังจากได้รับ System.InvalidOperationException
Bratch

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.