web-dev-qa-db-fra.com

Comment créer un programme d'installation pour un service Windows .net à l'aide de Visual Studio

Comment créer un programme d'installation pour un service Windows créé à l'aide de Visual Studio?

136
Kelsey

Dans le projet de service, procédez comme suit:

  1. Dans l'explorateur de solutions, double-cliquez sur votre fichier .cs de services. Il devrait faire apparaître un écran tout gris et parler de glisser des éléments de la boîte à outils.
  2. Puis cliquez avec le bouton droit sur la zone grise et sélectionnez Ajouter un installateur. Cela ajoutera un fichier de projet d'installation à votre projet.
  3. Ensuite, vous aurez 2 composants sur la vue de conception de ProjectInstaller.cs (serviceProcessInstaller1 et serviceInstaller1). Vous devez ensuite configurer les propriétés selon vos besoins, telles que le nom du service et l'utilisateur sous lequel il doit s'exécuter.

Vous devez maintenant créer un projet d’installation. La meilleure chose à faire est d'utiliser l'assistant d'installation.

  1. Cliquez avec le bouton droit sur votre solution et ajoutez un nouveau projet: Ajouter> Nouveau projet> Projets de configuration et de déploiement> Assistant de configuration

    une. Cela peut varier légèrement selon les versions de Visual Studio. b. Visual Studio 2010 il se trouve dans: Modèles d’installation> Autres types de projets> Configuration et déploiement> Programme d’installation de Visual Studio

  2. À la deuxième étape, sélectionnez "Créer une configuration pour une application Windows".

  3. À la 3ème étape, sélectionnez "Sortie primaire de ..."
  4. Cliquez pour terminer.

Ensuite, éditez votre programme d’installation pour vous assurer que le bon résultat est inclus.

  1. Cliquez avec le bouton droit sur le projet d'installation dans votre Explorateur de solutions.
  2. Sélectionnez Afficher> Actions personnalisées. (Dans VS2008, il peut s'agir de View> Editor> Actions personnalisées)
  3. Cliquez avec le bouton droit de la souris sur l'action d'installation dans l'arborescence des actions personnalisées et sélectionnez "Ajouter une action personnalisée ...".
  4. Dans la boîte de dialogue "Sélectionner un élément dans le projet", sélectionnez Dossier d'application et cliquez sur OK.
  5. Cliquez sur OK pour sélectionner l'option "Sortie principale de ...". Un nouveau noeud devrait être créé.
  6. Répétez les étapes 4 à 5 pour les actions de validation, d'annulation et de désinstallation.

Vous pouvez modifier le nom de sortie du programme d'installation en cliquant avec le bouton droit de la souris sur le projet d'installation dans votre solution et en sélectionnant Propriétés. Changez le 'Nom du fichier de sortie:' comme vous voulez. En sélectionnant également le projet d'installation et en regardant les fenêtres de propriétés, vous pouvez éditer le Product Name, Title, Manufacturer, etc ...

Ensuite, construisez votre programme d’installation et il produira un fichier MSI et un fichier setup.exe. Choisissez celui que vous souhaitez utiliser pour déployer votre service.

200
Kelsey

Je suis les premières étapes de Kelsey pour ajouter les classes du programme d’installation à mon projet de service, mais au lieu de créer un programme d’installation MSI ou setup.exe, je m’autorise à installer/désinstaller le service. Voici un exemple de code d'un de mes services que vous pouvez utiliser comme point de départ.

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

Ni Kelsey, ni les solutions Brendan ne fonctionnent pas pour moi dans Visual Studio 2015 Community.

Voici mes brèves étapes pour créer un service avec un installateur:

  1. Exécuter Visual Studio, Aller à File->New->Project
  2. Sélectionnez .NET Framework 4, dans le type 'Recherche de modèles installés' 'Service'
  3. Sélectionnez 'Service Windows'. Tapez le nom et l'emplacement. presse OK.
  4. Double-cliquez sur Service1.cs, cliquez avec le bouton droit de la souris sur le concepteur et sélectionnez "Ajouter un programme d'installation".
  5. Double-cliquez sur ProjectInstaller.cs. Pour serviceProcessInstaller1, ouvrez l'onglet Propriétés et remplacez la valeur de la propriété "Compte" par "LocalService". Pour serviceInstaller1, changez 'ServiceName' et réglez 'StartType' sur 'Automatique'.
  6. Double-cliquez sur serviceInstaller1. Visual Studio crée un événement _serviceInstaller1_AfterInstall_. Écrire le code:

    _private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
    {
        using (System.ServiceProcess.ServiceController sc = new 
        System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
        {
            sc.Start();
        }
    }
    _
  7. Construire la solution. Faites un clic droit sur le projet et sélectionnez "Ouvrir le dossier dans l'explorateur de fichiers". Allez à bin\Debug.

  8. Créez install.bat avec le script ci-dessous:

    _:::::::::::::::::::::::::::::::::::::::::
    :: 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. Créer un fichier uninstall.bat (changer dans la ligne pen-ult _/i_ en _/u_)
  10. Pour installer et démarrer le service, lancez install.bat, pour arrêter et désinstaller, lancez uninstall.bat
23
Alexey Obukhov

Pour VS2017, vous devrez ajouter l'extension VS "Projets d'installation de Microsoft Visual Studio 2017". Cela vous donnera des modèles de projet Visual Studio Installer supplémentaires. https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects#overview

Pour installer le service Windows, vous pouvez ajouter un nouveau projet de type d’assistant d’installation et suivre les étapes de la réponse de Kelsey https://stackoverflow.com/a/9021107/104004

10
ljsg

Les classes InstallUtil (ServiceInstaller) sont considérées comme des anti-modèles par la communauté Windows Installer. C'est un processus fragile, hors processus, qui réinvente la roue sans tenir compte du fait que Windows Installer prend en charge les services de manière intégrée.

Les projets de déploiement de Visual Studio (qui ne sont pas non plus hautement considérés et déconseillés dans la prochaine version de Visual Studio) ne prennent pas en charge les services en natif. Mais ils peuvent consommer des modules de fusion. Je voudrais donc jeter un coup d'œil à cet article de blog pour comprendre comment créer un module de fusion à l'aide de XML Windows Installer pouvant exprimer le service, puis utiliser ce module de fusion dans votre solution VDPROJ.

Augmenter InstallShield en utilisant Windows Installer XML - Services Windows

Didacticiel de service Windows IsWiX

Vidéo du service Windows IsWiX

1
Christopher Painter

Je sais que c'est un vieux fil, mais je voulais juste ajouter mes 2 centimes. J'ai toujours détesté la façon dont vous gérez un projet de service dans VS. C'est pourquoi j'ai utilisé Topshelf pendant de nombreuses années maintenant. Prenez du recul, ne créez pas de projet de service mais un projet de console, puis ajoutez-lui Topshelf. C'est effrayant facile.

https://github.com/Topshelf/Topshelf

0
Paw Baltzersen