В обозревателе решений дважды щелкните файл .cs вашего сервиса. Это должно вызвать экран, который весь серый и говорит о перетаскивании материала из панели инструментов.
Затем щелкните правой кнопкой мыши на серой области и выберите «Добавить установщик». Это добавит файл проекта установщика в ваш проект.
Затем у вас будет 2 компонента в представлении конструктора ProjectInstaller.cs (serviceProcessInstaller1 и serviceInstaller1). Затем вы должны настроить свойства, которые вам нужны, такие как имя службы и пользователя, под которым он должен работать.
Теперь вам нужно сделать проект установки. Лучше всего использовать мастер установки.
Щелкните правой кнопкой мыши свое решение и добавьте новый проект: Добавить> Новый проект> Проекты установки и развертывания> Мастер установки
а. Это может незначительно отличаться для разных версий Visual Studio. б. Visual Studio 2010 находится в: Шаблоны установки> Другие типы проектов> Установка и развертывание> Установщик Visual Studio
На втором шаге выберите «Создать установку для приложения Windows».
На третьем шаге выберите «Первичный выход из ...»
Нажмите, чтобы закончить.
Затем отредактируйте ваш установщик, чтобы убедиться, что включен правильный вывод.
Щелкните правой кнопкой мыши по проекту установки в обозревателе решений.
Выберите «Просмотр»> «Пользовательские действия». (В VS2008 это может быть View> Editor> Custom Actions)
Щелкните правой кнопкой мыши действие Install в дереве пользовательских действий и выберите «Добавить пользовательское действие ...»
В диалоговом окне «Выбрать элемент в проекте» выберите «Папка приложения» и нажмите «ОК».
Нажмите OK, чтобы выбрать опцию «Первичный вывод из ...». Новый узел должен быть создан.
Повторите шаги 4 - 5 для фиксации, отката и удаления действий.
Вы можете отредактировать выходное имя установщика, щелкнув правой кнопкой мыши проект установщика в своем решении и выбрав Свойства. Измените «Имя выходного файла:» на любое другое. Выбирая проект установки , а также и глядя на окна свойств, вы можете редактировать Product Name, Title, Manufacturerи т.д. ...
Затем соберите установщик, и он создаст MSI и файл setup.exe. Выберите тот, который вы хотите использовать для развертывания вашего сервиса.
@ El Ronnoco, у меня был ответ задолго до того, как я написал. Я хотел документировать это здесь, потому что мне всегда приходится искать его каждые 6 - 12 месяцев (и это было не так легко найти), так что теперь у меня есть его легко найти для всех, и я могу найти его сам быстро :)
Келси
1
К сожалению, это также неправильный ответ. Да, я знаю, вы найдете это в книгах и MSDN, но это тот случай, когда одна группа в Microsoft не общалась с другой группой в Microsoft и придумала более низкое решение проблемы, которая уже была решена. См. Blog.iswix.com/2006/07/msi-vs-net.html для получения дополнительной информации.
Кристофер Пэйнтер
9
@Christopher Painter Я использую установщик MS с 2k5, и у него никогда не было проблем. Согласны ли вы с этим и считаете ли вы его «анти-паттерном», вопрос не в этом, а в том, как я делаю х с у, а не как я делаю а с б. Когда я отправил вопрос, это было в целях документации.
Если Service name contains invalid characters, is empty, or is too long (max length = 80)при добавлении установщика появляется ошибка, снова щелкните правой кнопкой мыши в серой области, перейдите в Свойства и убедитесь, что установлено значение Имя службы.
Вольфюк
51
Я следую первому набору шагов Келси, чтобы добавить классы установщика в мой сервисный проект, но вместо создания установщика MSI или setup.exe я делаю сервис самостоятельно устанавливаемым / удаляемым. Вот пример кода из одного из моих сервисов, который вы можете использовать в качестве отправной точки.
publicstaticintMain(string[] args){if(System.Environment.UserInteractive){// we only care about the first two charactersstring arg = args[0].ToLowerInvariant().Substring(0,2);switch(arg){case"/i":// installreturnInstallService();case"/u":// uninstallreturnUninstallService();default:// unknown optionConsole.WriteLine("Argument not recognized: {0}", args[0]);Console.WriteLine(string.Empty);DisplayUsage();return1;}}else{// run as a standard service as we weren't started by a userServiceBase.Run(newCSMessageQueueService());}return0;}privatestaticintInstallService(){var service =newMyService();try{// perform specific install steps for our queue service.
service.InstallService();// install the service with the Windows Service Control Manager (SCM)ManagedInstallerClass.InstallHelper(newstring[]{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;}}return0;}privatestaticintUninstallService(){var service =newMyQueueService();try{// perform specific uninstall steps for our queue service
service.UninstallService();// uninstall the service from the Windows Service Control Manager (SCM)ManagedInstallerClass.InstallHelper(newstring[]{"/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;}}return0;}
Из любопытства, какая польза от самостоятельной установки / удаления службы? Если служба устанавливается сама, как вы запускаете службу первой, чтобы ее можно было установить в первую очередь? Если есть механизм запуска службы без ее установки, зачем вообще его устанавливать?
Кили Наро
3
@ Кристофер - нет. Мое решение не является заменой полного установщика, который вы бы использовали для распространения программного обеспечения. Я представляю другой вариант, который работает в некоторых ситуациях, например, мой, где я пишу программное обеспечение, которое управляет встроенными ПК в автоматических киосках.
4
Когда вы устанавливаете его на рабочий компьютер, не забудьте запустить его от имени администратора. Я создал BAT-файл, который вызывает EXE-файл с параметром / i, но он не работал в производственной среде, хотя я выполнял BAT-файл от имени администратора. Мне пришлось открыть приглашение командной строки от имени администратора и явно вызвать файл EXE / I (без использования файла BAT). По крайней мере, это случилось со мной на Windows Server 2012.
Франсиско Гольдштейн
1
RE: Нет вывода в командной строке. Использование VS 2017 Сообщество мой новый проект службы по умолчанию для типа вывода: Windows Applicationи объекта запуска: (none). Мне пришлось изменить тип вывода на Console Applicationи установить мой объект запуска, например myservice.Program. Если могут быть последствия, о которых я не знаю, пожалуйста, сообщите.
Джонатан
1
В примере кода есть опечатки? Почему существуют три разных сервиса (CSMessageQueueService, MyService, MyQueueService)?
Нильс Гильермин
27
Ни 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событие. Написать код:
privatevoid serviceInstaller1_AfterInstall(object sender,InstallEventArgs e){
using (System.ServiceProcess.ServiceController sc =newSystem.ServiceProcess.ServiceController(serviceInstaller1.ServiceName)){
sc.Start();}}
Построить решение. Щелкните правой кнопкой мыши по проекту и выберите «Открыть папку в проводнике». Перейдите в bin \ Debug .
Создайте install.bat с помощью приведенного ниже скрипта:
Классы InstallUtil (ServiceInstaller) рассматриваются сообществом установщика Windows как анти-шаблон. Это хрупкое, не в процессе, переизобретение колеса, которое игнорирует тот факт, что установщик Windows имеет встроенную поддержку служб.
Проекты развертывания Visual Studio (также не высоко оцененные и не рекомендуемые в следующем выпуске Visual Studio) не имеют встроенной поддержки служб. Но они могут потреблять модули слияния. Поэтому я хотел бы взглянуть на эту статью блога, чтобы понять, как создать модуль слияния с помощью установщика Windows XML, который может выражать службу, а затем использовать этот модуль слияния в вашем решении VDPROJ.
В старой Visual Studio существовал проект развертывания, с легким созданием установщика. Теперь я должен купить сторонний программный компонент?
Алексей Обухов
@AlexeyObukhov Вы можете использовать Wix бесплатно, это то, что использует сама VS, но проблема с Wix такая же, как и с Git - почти вертикальная кривая обучения.
Ответы:
В сервисном проекте сделайте следующее:
Теперь вам нужно сделать проект установки. Лучше всего использовать мастер установки.
Щелкните правой кнопкой мыши свое решение и добавьте новый проект: Добавить> Новый проект> Проекты установки и развертывания> Мастер установки
а. Это может незначительно отличаться для разных версий 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 я делаю сервис самостоятельно устанавливаемым / удаляемым. Вот пример кода из одного из моих сервисов, который вы можете использовать в качестве отправной точки.
источник
Windows Application
и объекта запуска:(none)
. Мне пришлось изменить тип вывода наConsole Application
и установить мой объект запуска, напримерmyservice.Program
. Если могут быть последствия, о которых я не знаю, пожалуйста, сообщите.Ни Kelsey, ни Brendan solutions не работают для меня в сообществе Visual Studio 2015.
Вот мои краткие шаги, как создать сервис с установщиком:
->
New->
ProjectДважды щелкните сервисInstaller1. Visual Studio создает
serviceInstaller1_AfterInstall
событие. Написать код:Построить решение. Щелкните правой кнопкой мыши по проекту и выберите «Открыть папку в проводнике». Перейдите в bin \ Debug .
Создайте install.bat с помощью приведенного ниже скрипта:
/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
IsWiX Windows Service Tutorial
IsWiX Windows Сервис Видео
источник