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

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

5 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Ни Kelsey, ни Brendan solutions не работают для меня в сообществе Visual Studio 2015. Вот мои шаги, как создать сервис с установщиком:

  1. Запустите VS, Файл-> Новый-> Проект
  2. Выберите.NET Framework 4, в разделе "Поиск установленных шаблонов" введите "Сервис"
  3. Выберите "Служба Windows". Введите имя и местоположение. Нажмите ОК
  4. Дважды щелкните Service1.cs, щелкните правой кнопкой мыши в конструкторе и выберите "Добавить установщик".
  5. Дважды щелкните ProjectInstaller.cs. Для serviceProcessInstaller1 откройте вкладку "Свойства" и измените значение свойства "Account" на "LocalService". Для serviceInstaller1 измените "ServiceName" и установите "StartType" на "Автоматический".
  6. Дважды щелкните сервис Installer1. VS создает событие 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 с текстом:
::::::::::::::::::::::::::::::::::::::::::: Автоматическая проверка и получение прав администратора:::::::::::::::::::::::::::::::::::::::::
    @ эхо выключено
    ЦБС 
    ECHO.
    ЭХО =============================
    ECHO Running Admin shell
    ЭХО =============================:checkPrivileges 
    NET FILE 1>NUL 2>NUL
    если '%errorlevel%' == '0' ( goto gotPrivileges) else ( goto getPrivileges):getPrivileges 
    если '%1'=='ELEV' (shift & goto gotPrivileges)  
    ECHO. 
    ЭХО **************************************
    ECHO вызывает UAC для повышения привилегий 
    ЭХО **************************************

    setlocal DisableDelayedExpansion
    установить "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" 
    выход /B:gotPrivileges:::::::::::::::::::::::::::::НАЧНИТЕ::::::::::::::::::::::::::::
    setlocal & pushd .

    кд / д% ~ дп0
    %windir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil /i "WindowsService1.exe"
    Пауза
  1. Создайте файл uninstall.bat (измените в строке Penult / I на / U)
  2. Для установки и запуска службы запустите install.bat, для остановки и удаления запустите uninstall.bat

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

Чтобы установить службу Windows, вы можете добавить новый тип проекта мастера установки и выполнить действия из ответа Келси /questions/32373021/kak-sozdat-ustanovschik-dlyanet-windows-service-s-pomoschyu-visual-studio/32373028#32373028

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

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

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

IsWiX Windows Service Tutorial

IsWiX Windows Сервис Видео

Другие вопросы по тегам