it-swarm.com.de

Erstellen eines Installationsprogramms für einen .NET-Windows-Dienst mithilfe von Visual Studio

Wie erstelle ich ein Installationsprogramm für einen Windows-Dienst, den ich mit Visual Studio erstellt habe?

136
Kelsey

Führen Sie im Serviceprojekt folgende Schritte aus:

  1. Doppelklicken Sie im Projektmappen-Explorer auf die CS-Datei Ihrer Dienste. Es sollte ein grauer Bildschirm angezeigt werden, auf dem über das Ziehen von Elementen aus der Toolbox gesprochen wird.
  2. Klicken Sie dann mit der rechten Maustaste auf den grauen Bereich und wählen Sie Installer hinzufügen. Dadurch wird Ihrem Projekt eine Installationsprojektdatei hinzugefügt.
  3. Dann haben Sie 2 Komponenten in der Entwurfsansicht von ProjectInstaller.cs (serviceProcessInstaller1 und serviceInstaller1). Sie sollten dann die Eigenschaften wie den Dienstnamen und den Benutzer, unter dem er ausgeführt werden soll, nach Bedarf einrichten.

Jetzt müssen Sie ein Setup-Projekt erstellen. Verwenden Sie am besten den Setup-Assistenten.

  1. Klicken Sie mit der rechten Maustaste auf Ihre Lösung und fügen Sie ein neues Projekt hinzu: Hinzufügen> Neues Projekt> Setup- und Bereitstellungsprojekte> Setup-Assistent

    ein. Dies kann für verschiedene Versionen von Visual Studio geringfügig variieren. b. Visual Studio 2010 befindet sich unter: Installationsvorlagen> Andere Projekttypen> Setup und Bereitstellung> Visual Studio Installer

  2. Wählen Sie im zweiten Schritt "Setup für eine Windows-Anwendung erstellen".

  3. Wählen Sie im dritten Schritt "Primäre Ausgabe von ..."
  4. Klicken Sie sich durch, um fertig zu stellen.

Bearbeiten Sie als Nächstes Ihr Installationsprogramm, um sicherzustellen, dass die richtige Ausgabe enthalten ist.

  1. Klicken Sie mit der rechten Maustaste auf das Setup-Projekt in Ihrem Projektmappen-Explorer.
  2. Wählen Sie Ansicht> Benutzerdefinierte Aktionen. (In VS2008 ist dies möglicherweise Ansicht> Editor> Benutzerdefinierte Aktionen.)
  3. Klicken Sie im Baum "Benutzerdefinierte Aktionen" mit der rechten Maustaste auf die Aktion "Installieren" und wählen Sie "Benutzerdefinierte Aktion hinzufügen ...".
  4. Wählen Sie im Dialogfeld "Element im Projekt auswählen" den Anwendungsordner aus und klicken Sie auf "OK".
  5. Klicken Sie auf OK, um die Option "Primäre Ausgabe von ..." auszuwählen. Ein neuer Knoten sollte erstellt werden.
  6. Wiederholen Sie die Schritte 4 bis 5 für Commit-, Rollback- und Deinstallationsaktionen.

Sie können den Namen der Installer-Ausgabe bearbeiten, indem Sie mit der rechten Maustaste auf das Installer-Projekt in Ihrer Projektmappe klicken und Eigenschaften auswählen. Ändern Sie den Namen der Ausgabedatei wie gewünscht. Wenn Sie auch das Installationsprojekt auswählen und die Eigenschaftenfenster anzeigen, können Sie das Product Name, Title, Manufacturer, etc ...

Als nächstes erstellen Sie Ihr Installationsprogramm und es wird eine MSI und eine setup.exe erzeugen. Wählen Sie aus, mit welcher Option Sie Ihren Service bereitstellen möchten.

200
Kelsey

Ich folge Kelseys ersten Schritten, um die Installationsklassen zu meinem Serviceprojekt hinzuzufügen, aber anstatt ein MSI- oder setup.exe-Installationsprogramm zu erstellen, installiere/deinstalliere ich den Service selbst. Hier ist ein Beispielcode von einem meiner Dienste, den Sie als Ausgangspunkt verwenden können.

public static int Main(string[] args)
{
    if (System.Environment.UserInteractive)
    {
        // we only care about the first two characters
        string arg = args[0].ToLowerInvariant().Substring(0, 2);

        switch (arg)
        {
            case "/i":  // install
                return InstallService();

            case "/u":  // uninstall
                return UninstallService();

            default:  // unknown option
                Console.WriteLine("Argument not recognized: {0}", args[0]);
                Console.WriteLine(string.Empty);
                DisplayUsage();
                return 1;
        }
    }
    else
    {
        // run as a standard service as we weren't started by a user
        ServiceBase.Run(new CSMessageQueueService());
    }

    return 0;
}

private static int InstallService()
{
    var service = new MyService();

    try
    {
        // perform specific install steps for our queue service.
        service.InstallService();

        // install the service with the Windows Service Control Manager (SCM)
        ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
    }
    catch (Exception ex)
    {
        if (ex.InnerException != null && ex.InnerException.GetType() == typeof(Win32Exception))
        {
            Win32Exception wex = (Win32Exception)ex.InnerException;
            Console.WriteLine("Error(0x{0:X}): Service already installed!", wex.ErrorCode);
            return wex.ErrorCode;
        }
        else
        {
            Console.WriteLine(ex.ToString());
            return -1;
        }
    }

    return 0;
}

private static int UninstallService()
{
    var service = new MyQueueService();

    try
    {
        // perform specific uninstall steps for our queue service
        service.UninstallService();

        // uninstall the service from the Windows Service Control Manager (SCM)
        ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
    }
    catch (Exception ex)
    {
        if (ex.InnerException.GetType() == typeof(Win32Exception))
        {
            Win32Exception wex = (Win32Exception)ex.InnerException;
            Console.WriteLine("Error(0x{0:X}): Service not installed!", wex.ErrorCode);
            return wex.ErrorCode;
        }
        else
        {
            Console.WriteLine(ex.ToString());
            return -1;
        }
    }

    return 0;
}
48
user10256

Weder Kelsey noch Brendan-Lösungen funktionieren bei mir in der Visual Studio 2015-Community nicht.

Hier sind meine kurzen Schritte zum Erstellen eines Dienstes mit dem Installationsprogramm:

  1. Führen Sie Visual Studio aus, und klicken Sie auf File->New->Project
  2. Wählen Sie unter "Installierte Vorlagen durchsuchen" die Option ".NET Framework 4" aus und geben Sie "Service" ein
  3. Wählen Sie "Windows-Dienst". Geben Sie Name und Ort ein. Drücken Sie OK.
  4. Doppelklicken Sie auf "Service1.cs", klicken Sie mit der rechten Maustaste in den Designer und wählen Sie "Installer hinzufügen".
  5. Doppelklicken Sie auf ProjectInstaller.cs. Öffnen Sie für serviceProcessInstaller1 die Registerkarte "Eigenschaften" und ändern Sie den Eigenschaftswert "Konto" in "LocalService". Ändern Sie für serviceInstaller1 'ServiceName' und setzen Sie 'StartType' auf 'Automatisch'.
  6. Doppelklicken Sie auf serviceInstaller1. Visual Studio erstellt serviceInstaller1_AfterInstall Veranstaltung. Code schreiben:

    private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
    {
        using (System.ServiceProcess.ServiceController sc = new 
        System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
        {
            sc.Start();
        }
    }
    
  7. Lösung erstellen. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie "Ordner im Datei-Explorer öffnen". Wechseln Sie zu bin\Debug.

  8. Erstelle install.bat mit folgendem Skript:

    :::::::::::::::::::::::::::::::::::::::::
    :: Automatically check & get admin rights
    :::::::::::::::::::::::::::::::::::::::::
    @echo off
    CLS 
    ECHO.
    ECHO =============================
    ECHO Running Admin Shell
    ECHO =============================
    
    :checkPrivileges 
    NET FILE 1>NUL 2>NUL
    if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges ) 
    
    :getPrivileges 
    if '%1'=='ELEV' (shift & goto gotPrivileges)  
    ECHO. 
    ECHO **************************************
    ECHO Invoking UAC for Privilege Escalation 
    ECHO **************************************
    
    setlocal DisableDelayedExpansion
    set "batchPath=%~0"
    setlocal EnableDelayedExpansion
    ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs" 
    ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs" 
    "%temp%\OEgetPrivileges.vbs" 
    exit /B 
    
    :gotPrivileges 
    ::::::::::::::::::::::::::::
    :START
    ::::::::::::::::::::::::::::
    setlocal & pushd .
    
    cd /d %~dp0
    %windir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil /i "WindowsService1.exe"
    pause
    
  9. Erstelle eine uninstall.bat Datei (Änderung in der pen-ult Zeile /i bis /u)
  10. Zum Installieren und Starten des Dienstes führen Sie install.bat aus, zum Beenden und Deinstallieren führen Sie uninstall.bat aus
23
Alexey Obukhov

Für VS2017 müssen Sie die VS-Erweiterung "Microsoft Visual Studio 2017 Installer Projects" hinzufügen. Dadurch erhalten Sie zusätzliche Visual Studio Installer-Projektvorlagen. https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects#overview

Um den Windows-Dienst zu installieren, können Sie ein neues Projekt für den Setup-Assistenten hinzufügen und die Schritte aus Kelseys Antwort https://stackoverflow.com/a/9021107/104004 ausführen

10
ljsg

InstallUtil-Klassen (ServiceInstaller) werden von der Windows Installer-Community als Antimuster angesehen. Die Neuerfindung des Rads ist ein zerbrechlicher Vorgang, bei dem die Tatsache ignoriert wird, dass Windows Installer integrierte Unterstützung für Dienste bietet.

Visual Studio-Bereitstellungsprojekte (die in der nächsten Version von Visual Studio ebenfalls nicht hoch angesehen und veraltet sind) bieten keine systemeigene Unterstützung für Dienste. Sie können jedoch Mergemodule verwenden. In diesem Blogartikel werde ich daher erläutern, wie Sie mit Windows Installer XML ein Mergemodul erstellen, das den Dienst ausdrückt, und dieses Mergemodul dann in Ihrer VDPROJ-Lösung verwenden.

Erweitern von InstallShield mithilfe von Windows Installer XML - Windows Services

IsWiX Windows Service Tutorial

IsWiX Windows Service Video

1

Ich weiß, dass dies ein alter Thread ist, aber ich wollte nur meine 2 Cent hinzufügen. Ich habe es immer gehasst, wie Sie ein Serviceprojekt in VS verwalten. Deshalb benutze ich Topshelf seit vielen Jahren. Machen Sie einen Schritt zurück, erstellen Sie stattdessen kein Dienstprojekt, sondern ein Konsolenprojekt, und fügen Sie Topshelf hinzu. Es ist unheimlich einfach.

https://github.com/Topshelf/Topshelf

0
Paw Baltzersen