Как создать установщик для.net Windows Service с помощью Visual Studio
Как создать установщик для службы Windows, созданной с помощью Visual Studio?
5 ответов
В сервисном проекте сделайте следующее:
- В обозревателе решений дважды щелкните файл.cs вашего сервиса. Он должен вызвать экран, который весь серый и говорит о перетаскивании материала из панели инструментов.
- Затем щелкните правой кнопкой мыши на серой области и выберите "Добавить установщик". Это добавит файл проекта установщика в ваш проект.
- Тогда у вас будет 2 компонента в представлении конструктора ProjectInstaller.cs (serviceProcessInstaller1 и serviceInstaller1). Затем вам нужно настроить свойства, которые вам нужны, такие как имя службы и пользователь, с которым она должна работать.
Теперь вам нужно сделать проект установки. Лучше всего использовать мастер установки.
Щелкните правой кнопкой мыши свое решение и добавьте новый проект: Добавить> Новый проект> Проекты установки и развертывания> Мастер установки
а. Это может незначительно отличаться для разных версий Visual Studio. б. Visual Studio 2010 находится в: Шаблоны установки> Другие типы проектов> Установка и развертывание> Установщик Visual Studio
На втором шаге выберите "Создать установку для приложения Windows".
- На третьем шаге выберите "Первичный выход из..."
- Нажмите, чтобы закончить.
Затем отредактируйте ваш установщик, чтобы убедиться, что включен правильный вывод.
- Щелкните правой кнопкой мыши по проекту установки в обозревателе решений.
- Выберите "Просмотр"> "Пользовательские действия". (В VS2008 это может быть View > Editor > Custom Actions)
- Щелкните правой кнопкой мыши действие "Установить" в дереве пользовательских действий и выберите "Добавить пользовательское действие..."
- В диалоговом окне "Выбрать элемент в проекте" выберите "Папка приложения" и нажмите "ОК".
- Нажмите OK, чтобы выбрать опцию "Первичный вывод из...". Новый узел должен быть создан.
- Повторите шаги 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. Вот мои шаги, как создать сервис с установщиком:
- Запустите VS, Файл-> Новый-> Проект
- Выберите.NET Framework 4, в разделе "Поиск установленных шаблонов" введите "Сервис"
- Выберите "Служба Windows". Введите имя и местоположение. Нажмите ОК
- Дважды щелкните Service1.cs, щелкните правой кнопкой мыши в конструкторе и выберите "Добавить установщик".
- Дважды щелкните ProjectInstaller.cs. Для serviceProcessInstaller1 откройте вкладку "Свойства" и измените значение свойства "Account" на "LocalService". Для serviceInstaller1 измените "ServiceName" и установите "StartType" на "Автоматический".
Дважды щелкните сервис 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(); } }
Построить решение. Щелкните правой кнопкой мыши по проекту и выберите "Открыть папку в проводнике". Перейдите в bin\Debug.
- Создайте 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" Пауза
- Создайте файл uninstall.bat (измените в строке Penult / I на / U)
- Для установки и запуска службы запустите 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