Inno Setup untuk layanan Windows?

105

Saya memiliki layanan Windows .Net. Saya ingin membuat penginstal untuk menginstal layanan windows itu.

Pada dasarnya, ini harus melakukan hal berikut:

  1. Paket installutil.exe(Apakah itu diperlukan?)
  2. Jalankan installutil.exeMyService.exe
  3. Mulai MyService

Juga, saya ingin menyediakan uninstaller yang menjalankan perintah berikut:

installutil.exe /u MyService.exe

Bagaimana cara melakukannya dengan menggunakan Inno Setup?

devnull
sumber
Saya rasa Anda perlu menggunakan bagian [Jalankan]. Lihat di sini
Preet Sangha

Jawaban:

233

Anda tidak perlu installutil.exedan mungkin Anda bahkan tidak memiliki hak untuk mendistribusikannya kembali.

Inilah cara saya melakukannya di aplikasi saya:

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());
    }
}

Pada dasarnya Anda dapat memiliki layanan Anda untuk menginstal / menghapus sendiri dengan menggunakan ManagedInstallerClassseperti yang ditunjukkan dalam contoh saya.

Maka itu hanya masalah menambahkan ke dalam skrip InnoSetup Anda seperti ini:

[Run]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--install"

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"
lubos hasko
sumber
3
kamu bisa mencoba Filename: "net.exe"; Parameters: "start WinServ". jika tidak berhasil, Anda bisa menambahkan satu sakelar lagi --mulai ke aplikasi c # Anda dan mulai layanan windows langsung dari program dengan menggunakan kelas ServiceController ( msdn.microsoft.com/en-us/library/… ).
lubos hasko
2
+1 Bagus. Lihat juga stackoverflow.com/questions/255056/…
Ruben Bartelink
7
Untuk C # orang baru (seperti saya), Anda baik perlu menambahkan using System.Reflection;atau mengubah Assemblyke System.Reflection.Assemblydalam kode di atas.
rlandster
1
InstallUtil adalah bagian dari kerangka dot net, Anda tidak memerlukan "hak" untuk mendistribusikannya, ini sudah ada di sistem target Anda (dengan asumsi Anda dapat menjalankan aplikasi Anda di tempat pertama tentunya)
Andrew Savinykh
10
Dari dokumentasi tentang metode InstallHelper di 4.5 - "API ini mendukung infrastruktur .NET Framework dan tidak dimaksudkan untuk digunakan secara langsung dari kode Anda." Ditemukan setelah menerima System.InvalidOperationException.
Bratch
8

Begini cara saya melakukannya:

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

Rupanya, penyiapan Inno memiliki konstanta berikut untuk mereferensikan folder .NET di sistem Anda:

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

Informasi lebih lanjut tersedia di sini .

semilir
sumber
5

Kamu bisa memakai

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

untuk membuat layanan. Lihat " sc.exe " tentang cara memulai, menghentikan, memeriksa status layanan, menghapus layanan, dll.

Steven
sumber
2

Jika Anda ingin menghindari reboot saat pengguna melakukan upgrade maka Anda harus menghentikan layanan sebelum menyalin exe dan memulai lagi setelahnya.

Ada beberapa fungsi skrip untuk melakukan ini di Layanan - Fungsi untuk Memulai, Menghentikan, Menginstal, Menghapus Layanan

Tony Edgecombe
sumber
Dalam artikel tertaut, prototipe fungsi yang digunakan tidak diterjemahkan dengan tepat dan penggunaannya juga tidak benar (misalnya, tidak menunggu layanan dimulai, berhenti, dll.).
TLama