Inno Setup for Windows hizmeti?


105

.Net Windows hizmetim var. Bu Windows hizmetini kurmak için bir yükleyici oluşturmak istiyorum.

Temel olarak aşağıdakileri yapması gerekir:

  1. Paketi installutil.exe (Gerekli mi?)
  2. Çalıştırmak installutil.exeMyService.exe'yi
  3. MyService'i Başlat

Ayrıca, aşağıdaki komutu çalıştıran bir kaldırıcı sağlamak istiyorum:

installutil.exe /u MyService.exe

Inno Setup kullanılarak bunlar nasıl yapılır?


[Çalıştır] bölümünü kullanmanız gerektiğini düşünüyorum. Buraya
Preet Sangha

Yanıtlar:


233

İhtiyacınız yok installutil.exeve muhtemelen onu yeniden dağıtma hakkınız bile yok.

Başvurumda bunu şu şekilde yapıyorum:

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

Temel olarak, örneğimde ManagedInstallerClassgösterildiği gibi hizmetinizin kendi başına kurmasını / kaldırmasını sağlayabilirsiniz .

O halde InnoSetup betiğinize şunun gibi bir şey eklemeniz yeterli:

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

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"

3
deneyebilirsin Filename: "net.exe"; Parameters: "start WinServ". işe yaramazsa, c # uygulamanıza bir tane daha anahtar ekleyebilir ve Windows hizmetini ServiceController sınıfını ( msdn.microsoft.com/en-us/library/… ) kullanarak doğrudan programdan başlatabilirsiniz .
lubos hasko


7
C # neofiti için (benim gibi), yukarıdaki koda bir eklemeniz using System.Reflection;veya değiştirmeniz Assemblygerekir System.Reflection.Assembly.
rlandster

1
InstallUtil, nokta net çerçevesinin bir parçasıdır, yeniden dağıtmak için "haklara" ihtiyacınız yoktur, hedef sisteminizde zaten mevcuttur (uygulamanızı ilk etapta çalıştırabileceğinizi varsayarsak)
Andrew Savinykh

10
4.5'teki InstallHelper yöntemiyle ilgili belgelerden - "Bu API, .NET Framework altyapısını destekler ve doğrudan kodunuzdan kullanılması amaçlanmamıştır." System.InvalidOperationException aldıktan sonra bulundu.
2014

8

İşte bunu nasıl yaptım:

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

Görünüşe göre Inno kurulumu, sisteminizdeki .NET klasörüne başvurmak için aşağıdaki sabitlere sahiptir:

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

Daha fazla bilgiye buradan ulaşabilirsiniz .


5

Kullanabilirsiniz

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

bir hizmet oluşturmak için. Nasıl başlatılacağı, durdurulacağı, servis durumunun nasıl kontrol edileceği, servisin silineceği vb. Hakkında " sc.exe " ye bakın .


2

Kullanıcı yükseltme yaptığında yeniden başlatmayı önlemek istiyorsanız, exe'yi kopyalamadan önce hizmeti durdurmanız ve ardından yeniden başlamanız gerekir.

Bunu Servis - Başlatmak, Durdurmak, Kurmak, Bir Servisi Kaldırmak için Fonksiyonlar'da yapmak için bazı komut dosyası fonksiyonları vardır.


Bağlantılı makalenizde, kullanılan işlevlerin prototipleri tam olarak çevrilmemiştir ve kullanımları da doğru değildir (örneğin hizmetin başlaması, durması vb. İçin bekleme yoktur).
TLama
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.