Відповіді:
У проекті обслуговування виконайте наступне:
Тепер вам потрібно зробити проект налаштування. Найкраще зробити це - використовувати майстра налаштування.
Клацніть правою кнопкою миші рішення та додайте новий проект: Додати> Новий проект> Проекти налаштування та розгортання> Майстер налаштування
а. Це може дещо відрізнятися для різних версій Visual Studio. б. Visual Studio 2010 знаходиться в: Встановити шаблони> Інші типи проектів> Налаштування та розгортання> Установник Visual Studio
На другому кроці виберіть «Створити налаштування для програми Windows».
На 3-му кроці виберіть "Первинний вихід з ..."
Клацніть через, щоб закінчити.
Далі відредагуйте інсталятор, щоб переконатися, що входить правильний вихід.
Ви можете відредагувати вихідне ім'я інсталятора, клацнувши правою кнопкою миші проект Installer у своєму рішенні та виберіть Властивості. Змініть "Ім'я вихідного файлу:" на те, що ви хочете. Вибираючи проект установки , а також і дивлячись на вікна властивостей, ви можете редагувати Product Name
, Title
, Manufacturer
і т.д. ...
Далі побудуйте інсталятор, і він створить MSI та setup.exe. Виберіть те, що ви хочете використовувати для розгортання вашої послуги.
Service name contains invalid characters, is empty, or is too long (max length = 80)
помилку під час додавання програми встановлення, потім знову клацніть правою кнопкою миші в сірій області, перейдіть до Властивості та переконайтесь, що встановлено значення Імені служби.
Я дотримуюся першого кроку 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;
}
Windows Application
і об'єкта запуску: (none)
. Мені довелося змінити тип вихідного сигналу Console Application
і встановити свій об'єкт запуску, наприклад myservice.Program
. Якщо можуть бути наслідки, про які я не знаю, будь ласка, порадьте.
Ні рішення Келсі, ні Брендан не працюють для мене у спільноті Visual Studio 2015.
Ось мої короткі кроки, як створити сервіс з інсталятором:
->
New->
ProjectДвічі клацніть serviceInstaller1. 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();
}
}
Будувати рішення. Клацніть правою кнопкою миші на проект і виберіть «Відкрити папку у провіднику файлів». Перейдіть до бін \ налагодження .
Створіть 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, ви можете додати новий проект типу майстра налаштування та виконувати кроки з відповіді Kelsey https://stackoverflow.com/a/9021107/1040040
Класи InstallUtil (ServiceInstaller) вважаються анти-зразком спільнотою Windows Installer. Це неміцне, позадувельне вигадування колеса, що ігнорує той факт, що Windows Installer має вбудовану підтримку служб.
Проекти розгортання Visual Studio (також не високо оцінені та застарілі в наступному випуску Visual Studio) не мають вбудованої підтримки служб. Але вони можуть споживати модулі злиття. Отож, я перегляну цю статтю в блозі, щоб зрозуміти, як створити модуль злиття за допомогою Windows Installer XML, який може виразити послугу, а потім споживати цей модуль злиття у вашому рішенні VDPROJ.
Розширення InstallShield за допомогою Windows Installer XML - Служби Windows