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

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

Ответ 1

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

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

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

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

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

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

  • На третьем шаге выберите "Первичный вывод из..."
  • Нажмите "Готово".

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

  • Щелкните правой кнопкой мыши проект установки в своем обозревателе решений.
  • Выберите "Просмотр" > "Пользовательские действия". (В VS2008 это может быть View > Editor > Custom Actions)
  • Щелкните правой кнопкой мыши действие "Установка" в дереве пользовательских действий и выберите "Добавить пользовательское действие..."
  • В диалоговом окне "Выбрать элемент в проекте" выберите "Папка приложения" и нажмите "ОК".
  • Нажмите "ОК", чтобы выбрать опцию "Первичный выход из...". Необходимо создать новый node.
  • Повторите шаги 4-5 для фиксации, отката и удаления.

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

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

Ответ 2

Я выполняю первый шаг Kelsey, чтобы добавить классы установщика в мой сервисный проект, но вместо создания установщика 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;
}

Ответ 3

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

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

  1. Запустите Visual Studio, перейдите к File->New->Project
  2. Выберите .NET Framework 4, в поле "Поиск установленных шаблонов" введите "Служба"
  3. Выберите "Служба Windows". Введите имя и местоположение. Нажмите OK.
  4. Дважды щелкните Service1.cs, щелкните правой кнопкой мыши в конструкторе и выберите "Добавить установщик"
  5. Дважды щелкните ProjectInstaller.cs. Для serviceProcessInstaller1 откройте вкладку "Свойства" и измените значение свойства "Account" на "LocalService". Для serviceInstaller1 измените "ServiceName" и установите "StartType" на "Автоматический".
  6. Дважды щелкните сервисInstaller1. 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

Ответ 4

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

Чтобы установить службу Windows, вы можете добавить новый тип мастера установки проекта и следуйте инструкциям из ответа Келси. fooobar.com/questions/55027/...

Ответ 5

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

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

Дополнение InstallShield с помощью Windows Installer XML - Службы Windows

Учебное пособие по установке IsWiX для Windows

IsWiX Windows Service Video

Ответ 6

Я знаю, что это старая ветка, но я просто хотел добавить свои 2 цента. Я всегда ненавидел то, как вы управляете сервисным проектом в VS. Вот почему я использовал Topshelf уже много лет. Сделайте шаг назад, не создавайте сервисный проект, а вместо этого консольный проект, затем добавьте в него Topshelf. Это страшно легко.

https://github.com/Topshelf/Topshelf