Как создать установщик для Windows Service, который я создал с помощью Visual Studio?
Как создать установщик для .net службы Windows с помощью 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.
Вот мои краткие инструкции по созданию службы с помощью установщика:
- Запустите Visual Studio, перейдите к File
->
New->
Project - Выберите .NET Framework 4, в поле "Поиск установленных шаблонов" введите "Служба"
- Выберите "Служба Windows". Введите имя и местоположение. Нажмите OK.
- Дважды щелкните Service1.cs, щелкните правой кнопкой мыши в конструкторе и выберите "Добавить установщик"
- Дважды щелкните ProjectInstaller.cs. Для serviceProcessInstaller1 откройте вкладку "Свойства" и измените значение свойства "Account" на "LocalService". Для serviceInstaller1 измените "ServiceName" и установите "StartType" на "Автоматический".
Дважды щелкните сервис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(); } }
Построить решение. Щелкните правой кнопкой мыши по проекту и выберите "Открыть папку в проводнике". Перейдите в bin\Debug.
Создайте 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
- Создайте файл uninstall.bat (измените строку Pen-Ult
/i
на/u
) - Для установки и запуска службы запустите 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
Ответ 6
Я знаю, что это старая ветка, но я просто хотел добавить свои 2 цента. Я всегда ненавидел то, как вы управляете сервисным проектом в VS. Вот почему я использовал Topshelf уже много лет. Сделайте шаг назад, не создавайте сервисный проект, а вместо этого консольный проект, затем добавьте в него Topshelf. Это страшно легко.