Установка службы Windows, созданной в Visual Studio
Когда я создаю новую службу Windows в Visual Studio 2010, я получаю сообщение с предложением использовать InstallUtil и net start для запуска службы.
Я пробовал следующие шаги:
- Создать новый файл проекта → Создать → Проект → Служба Windows
- Название проекта: TestService
- Построить проект как есть (конструктор Service1, OnStart, OnStop)
- Откройте командную строку, запустите "C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" TestService.exe
- Запустите net start TestService.
Вывод шага 4
Запуск транзакционной установки.
Начало этапа установки.
См. содержимое файла журнала для C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestService\OBJ\x86\Debug\TestService.exe прогресс сборки.
Файл находится в папке C:\Users\myusername\Documents\Visual Studio 2010\Проекты\Тес TService\TestService\OBJ\x86\Debug\TestService.InstallLog.
Установка сборки 'C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestS ervice\TestService\obj\x86\Debug\TestService.exe '.
Затронутыми параметрами являются:
logtoconsole =
logfile = C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestService\T estService\OBJ\x86\Debug\TestService.InstallLog
assemblypath = C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestServ ice\TestService\obj\x86\Debug\TestService.exe
Нет публичных инсталляторов с атрибутом RunInstallerAttribute.Yes можно найти в папке C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestSe rvice\obj\x86\Debug\TestService.exe сборка.
Фаза установки успешно завершена, и фаза фиксации начало.
См. содержимое файла журнала для C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestService\OBJ\x86\Debug\TestService.exe прогресс сборки.
Файл находится в папке C:\Users\myusername\Documents\Visual Studio 2010\Проекты\Тес TService\TestService\OBJ\x86\Debug\TestService.InstallLog.
Завершение сборки 'C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestS ervice\TestService\obj\x86\Debug\TestService.exe '.
Затронутыми параметрами являются:
logtoconsole =
logfile = C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestService\T estService\OBJ\x86\Debug\TestService.InstallLog
assemblypath = C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestServ ice\TestService\obj\x86\Debug\TestService.exe
Нет публичных инсталляторов с атрибутом RunInstallerAttribute.Yes можно найти в папке C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestSe rvice\obj\x86\Debug\TestService.exe сборка.
Удалите файл InstallState, потому что нет инсталляторов.
Успешная фаза завершена.
Завершенная транзакция завершена.
Вывод этапа 5
Недопустимое имя службы.
Дополнительную помощь можно получить, набрав NET HELPMSG 2185.
Ответы
Ответ 1
Вам нужно открыть файл Service.cs в дизайнере, щелкните его правой кнопкой мыши и выберите пункт меню "Добавить установщик".
Он не будет устанавливаться прямо из коробки... вам нужно сначала создать класс установщика.
Некоторая ссылка на сервис-установщик:
Как установить установщиков в ваше служебное приложение
Довольно старый... но об этом я и говорю:
Службы Windows на С#: добавление установщика (часть 3)
При этом автоматически создается ProjectInstaller.cs
. Затем вы можете дважды щелкнуть по нему, ввести конструктор и настроить компоненты:
-
serviceInstaller1
имеет свойства самой службы: Description
, DisplayName
, ServiceName
и StartType
являются наиболее важными.
-
serviceProcessInstaller1
имеет это важное свойство: Account
thas - это учетная запись, в которой будет работать служба.
Например:
this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
Ответ 2
Глядя на:
Никаких публичных инсталляторов с атрибутом RunInstallerAttribute.Yes можно найти в сборке C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestSe rvice\obj\x86\Debug\TestService.exe.
Похоже, у вас может не быть класса установщика в вашем коде. Это класс, который наследует от Installer
, который сообщает installutil
, как установить ваш исполняемый файл как службу.
P.s. У меня есть мой собственный собственный самозагружаемый/отлаживаемый шаблон службы Windows, в котором вы можете скопировать код или использовать: Отладка, самоостановка службы Windows
Ответ 3
Вот альтернативный способ сделать установщик и избавиться от этого сообщения об ошибке. Также кажется, что VS2015 express не имеет пункта меню "Добавить установщик".
Вам просто нужно создать класс и добавить код ниже и добавить ссылку System.Configuration.Install.dll.
using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;
namespace SAS
{
[RunInstaller(true)]
public class MyProjectInstaller : Installer
{
private ServiceInstaller serviceInstaller1;
private ServiceProcessInstaller processInstaller;
public MyProjectInstaller()
{
// Instantiate installer for process and service.
processInstaller = new ServiceProcessInstaller();
serviceInstaller1 = new ServiceInstaller();
// The service runs under the system account.
processInstaller.Account = ServiceAccount.LocalSystem;
// The service is started manually.
serviceInstaller1.StartType = ServiceStartMode.Manual;
// ServiceName must equal those on ServiceBase derived classes.
serviceInstaller1.ServiceName = "SAS Service";
// Add installer to collection. Order is not important if more than one service.
Installers.Add(serviceInstaller1);
Installers.Add(processInstaller);
}
}
}
Ответ 4
Другая возможная проблема (с которой я столкнулся):
Убедитесь, что класс ProjectInstaller
public
. Честно говоря, я не уверен, как именно я это сделал, но добавил обработчики событий в ProjectInstaller.Designer.cs
, например:
this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);
Я думаю, что во время автоматического процесса создания функции обработчика в ProjectInstaller.cs
он изменил определение класса из
public class ProjectInstaller : System.Configuration.Install.Installer
к
partial class ProjectInstaller : System.Configuration.Install.Installer
заменив ключевое слово public
partial
. Итак, чтобы исправить это, он должен быть
public partial class ProjectInstaller : System.Configuration.Install.Installer
Я использую редакцию Visual Studio 2013 Community.
Ответ 5
Две типичные проблемы:
- Отсутствует класс ProjectInstaller (как указал @MiguelAngelo)
- Командная строка должна "Запускать как Администратор"
Ответ 6
Изменения Stealth в VS 2010 и .NET 4.0 и более поздних версиях
Нет общедоступных инсталляторов с атрибутом RunInstallerAttribute.Yes.
В .NET есть модификация смены псевдонимов или компиляторов, которая может выявить эту небольшую настройку для вашего конкретного случая.
Если у вас есть следующий код...
RunInstaller(true) // old alias
Вам может потребоваться обновить его до
RunInstallerAttribute(true) // new property spelling
Это похоже на псевдоним, измененный под обложками во время компиляции или во время выполнения, и вы получите это поведение ошибки. Вышеуказанное явное изменение в RunInstallerAttribute (true) зафиксировало его во всех наших сценариях установки на всех машинах.
После того, как вы добавите установщик проекта или службы, проверьте "старый" RunInstaller (true) и измените его на новый RunInstallerAttribute (true)