Ответы:
В сервисном проекте сделайте следующее:
Теперь вам нужно сделать проект установки. Лучше всего использовать мастер установки.
Щелкните правой кнопкой мыши свое решение и добавьте новый проект: Добавить> Новый проект> Проекты установки и развертывания> Мастер установки
а. Это может незначительно отличаться для разных версий Visual Studio. б. Visual Studio 2010 находится в: Шаблоны установки> Другие типы проектов> Установка и развертывание> Установщик Visual Studio
На втором шаге выберите «Создать установку для приложения Windows».
На третьем шаге выберите «Первичный выход из ...»
Нажмите, чтобы закончить.
Затем отредактируйте ваш установщик, чтобы убедиться, что включен правильный вывод.
Вы можете отредактировать выходное имя установщика, щелкнув правой кнопкой мыши проект установщика в своем решении и выбрав Свойства. Измените «Имя выходного файла:» на любое другое. Выбирая проект установки , а также и глядя на окна свойств, вы можете редактировать Product Name
, Title
, Manufacturer
и т.д. ...
Затем соберите установщик, и он создаст MSI и файл setup.exe. Выберите тот, который вы хотите использовать для развертывания вашего сервиса.
Service name contains invalid characters, is empty, or is too long (max length = 80)
при добавлении установщика появляется ошибка, снова щелкните правой кнопкой мыши в серой области, перейдите в Свойства и убедитесь, что установлено значение Имя службы.
Я следую первому набору шагов Келси, чтобы добавить классы установщика в мой сервисный проект, но вместо создания установщика 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;
}
Windows Application
и объекта запуска: (none)
. Мне пришлось изменить тип вывода на Console Application
и установить мой объект запуска, например myservice.Program
. Если могут быть последствия, о которых я не знаю, пожалуйста, сообщите.
Ни Kelsey, ни Brendan solutions не работают для меня в сообществе Visual Studio 2015.
Вот мои краткие шаги, как создать сервис с установщиком:
->
New->
ProjectДважды щелкните сервис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
/i
на/u
)Для 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.
Классы InstallUtil (ServiceInstaller) рассматриваются сообществом установщика Windows как анти-шаблон. Это хрупкое, не в процессе, переизобретение колеса, которое игнорирует тот факт, что установщик Windows имеет встроенную поддержку служб.
Проекты развертывания Visual Studio (также не высоко оцененные и не рекомендуемые в следующем выпуске Visual Studio) не имеют встроенной поддержки служб. Но они могут потреблять модули слияния. Поэтому я хотел бы взглянуть на эту статью блога, чтобы понять, как создать модуль слияния с помощью установщика Windows XML, который может выражать службу, а затем использовать этот модуль слияния в вашем решении VDPROJ.
Дополнение InstallShield с помощью установщика Windows XML - Службы Windows