Как создать установщик для .net Windows Service с помощью Visual Studio - PullRequest
133 голосов
/ 26 января 2012

Как мне создать установщик для службы Windows, которую я создал с помощью Visual Studio?

Ответы [ 5 ]

194 голосов
/ 26 января 2012

В сервисном проекте выполните следующие действия:

  1. В обозревателе решений дважды щелкните файл .cs вашего сервиса.Должен появиться экран, который весь серый и говорит о перетаскивании чего-либо из панели инструментов.
  2. Затем щелкните правой кнопкой мыши на серой области и выберите Добавить установщик.Это добавит файл проекта установщика в ваш проект.
  3. Тогда у вас будет 2 компонента в представлении проекта ProjectInstaller.cs (serviceProcessInstaller1 и serviceInstaller1).Затем вы должны настроить нужные вам свойства, такие как имя службы и имя пользователя, для которого она должна работать.

Теперь вам нужно создать проект установки.Лучше всего использовать мастер установки.

  1. Щелкните правой кнопкой мыши свое решение и добавьте новый проект: Добавить> Новый проект> Проекты установки и развертывания> Мастер установки

    а.Это может незначительно отличаться для разных версий Visual Studio.б.Visual Studio 2010 находится в: Шаблоны установки> Другие типы проектов> Установка и развертывание> Установщик Visual Studio

  2. На втором шаге выберите «Создать установку для приложения Windows».

  3. На 3-м шаге выберите «Первичный выход из ...»
  4. Нажмите, чтобы завершить.

Затем отредактируйте установщик, чтобы убедиться, чтоправильный вывод включен.

  1. Щелкните правой кнопкой мыши проект установки в обозревателе решений.
  2. Выберите Вид> Пользовательские действия.(В VS2008 это может быть View> Editor> Custom Actions)
  3. Щелкните правой кнопкой мыши действие Install в дереве пользовательских действий и выберите «Add Custom Action ...»
  4. InВыберите «Элемент в проекте», выберите «Папка приложения» и нажмите «ОК».
  5. Нажмите «ОК», чтобы выбрать «Первичный вывод из ...».Новый узел должен быть создан.
  6. Повторите шаги 4 - 5 для действий фиксации, отката и удаления.

Вы можете отредактировать выходное имя установщика, щелкнув правой кнопкой мыши проект установщика в вашемрешение и выберите Свойства.Измените «Имя выходного файла:» на любое другое.Также, выбрав проект установщика и просмотрев окна свойств, вы можете отредактировать Product Name, Title, Manufacturer и т. Д.

Далее соберите установщик, и он выдаст MSIи setup.exe.Выберите, какой вы хотите использовать для развертывания службы.

47 голосов
/ 26 января 2012

Я следую первому набору шагов Келси, чтобы добавить классы установщика в мой сервисный проект, но вместо создания установщика MSI или setup.exe я делаю сервис самостоятельно устанавливающим / удаляющим. Вот пример кода из одного из моих сервисов, который вы можете использовать в качестве отправной точки.

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;
}
22 голосов
/ 23 июня 2016

Ни решения Kelsey, ни Brendan не работают для меня в сообществе Visual Studio 2015.

Вот мои краткие инструкции по созданию службы с помощью установщика:

  1. Запуск Visual Studio, Перейти к Файл -> Новый -> Проект
  2. Выбрать.NET Framework 4, в поле «Поиск установленных шаблонов» введите «Служба»
  3. Выберите «Служба Windows».Введите имя и местоположение.Нажмите OK .
  4. Дважды щелкните Service1.cs, щелкните правой кнопкой мыши в конструкторе и выберите «Добавить установщик»
  5. Дважды щелкните ProjectInstaller.cs.Для serviceProcessInstaller1 откройте вкладку «Свойства» и измените значение свойства «Account» на «LocalService».Для serviceInstaller1 измените «ServiceName» и установите для «StartType» значение «Automatic».
  6. Дважды щелкните serviceInstaller1.Visual Studio создает событие serviceInstaller1_AfterInstall.Напишите код:

    private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
    {
        using (System.ServiceProcess.ServiceController sc = new 
        System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
        {
            sc.Start();
        }
    }
    
  7. Построить решение.Щелкните правой кнопкой мыши по проекту и выберите «Открыть папку в проводнике».Перейдите в bin \ Debug .

  8. Создайте install.bat с помощью приведенного ниже сценария:

    :::::::::::::::::::::::::::::::::::::::::
    :: 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. Создайте файл uninstall.bat (измените строку Pen ULT /i на /u)
  10. Чтобы установить и запустить службу, запустите install.bat, чтобы остановить и удалить, запустите uninstall.bat
9 голосов
/ 01 апреля 2018

Для VS2017 вам необходимо добавить расширение VS «Проекты установщика Microsoft Visual Studio 2017». Это даст вам дополнительные шаблоны проектов Visual Studio Installer. https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects#overview

Чтобы установить службу Windows, вы можете добавить новый тип проекта мастера установки и выполнить шаги из ответа Келси https://stackoverflow.com/a/9021107/1040040

1 голос
/ 26 января 2012

Классы InstallUtil (ServiceInstaller) рассматриваются сообществом установщика Windows как анти-шаблон.Это хрупкое, непроцессное повторное изобретение колеса, которое игнорирует тот факт, что установщик Windows имеет встроенную поддержку служб.

Проекты развертывания Visual Studio (также не высоко ценится и не рекомендуется в следующем выпуске VisualStudio) не имеют встроенной поддержки сервисов.Но они могут потреблять модули слияния.Поэтому я хотел бы взглянуть на эту статью блога, чтобы понять, как создать модуль слияния с помощью установщика Windows XML, который может выражать службу, а затем использовать этот модуль слияния в вашем решении VDPROJ.

Дополнение InstallShield с помощьюУстановщик Windows XML - Службы Windows

Учебное пособие по Windows IsWiX

Видео службы Windows IsWiX

...