Установите службу Windows, созданную в Visual Studio


136

Когда я создаю новую службу Windows в Visual Studio 2010, я получаю сообщение об использовании InstallUtil и net start для запуска службы.

Я пробовал следующие шаги:

  1. Создать новый проект Файл -> Новый -> Проект -> Служба Windows
  2. Название проекта: ТестСервис
  3. Построить проект как есть (конструктор Service1, OnStart, OnStop)
  4. Откройте командную строку, запустите «C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe» TestService.exe
  5. Запустите 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 \ Projects \ Tes 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 \ Projects \ Tes 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.

Ответы:


243

Вам нужно открыть файл Service.cs в конструкторе, щелкнуть по нему правой кнопкой мыши и выбрать пункт меню «Добавить установщик».

Он не будет установлен сразу после установки ... сначала нужно создать класс установщика.

Некоторые ссылки на сервисный установщик:

Как добавить установщики в приложение-службу

Довольно старый ... но это то, о чем я говорю:

Службы Windows в C #: добавление установщика (часть 3)

Делая это, ProjectInstaller.csбудет автоматически создан. Затем вы можете дважды щелкнуть по нему, ввести конструктор и настроить компоненты:

  • serviceInstaller1обладают свойствами самой службы: Description, DisplayName, ServiceNameи StartTypeявляются наиболее важными.

  • serviceProcessInstaller1имеет это важное свойство: Accountэто учетная запись, в которой будет работать служба.

Например:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

3
Добавление установщика и настройка учетной записи в LocalSystem сделали это. Спасибо!
— Люк

1
Я получаю ту же ошибку в VS2013. Я проверил предоставленные вами ссылки и убедился, что у меня правильно установлен ProjectInstaller, включая компонент службы [Process] Installer1. Я запускаю installutil.exe от имени администратора. Он по-прежнему сообщает: «Не найдено общедоступных установщиков с атрибутом RunInstallerAttribute.Yes». Любые идеи?
— Барри Дайсерт

4
Ржунимагу. Мне нравится, что ссылка "Довольно старая" относится к сайту под названием Arcane Code. Чем старше становится эта страница, тем
— правдивее

Что такое «дизайнер»? Приложения, которые не имеют пользовательского интерфейса, обычно не содержат ничего, что можно было бы назвать дизайнером.
— Maxx

У сервисов тоже есть дизайнер, как и у форм
— Grungondola

11

Смотря на:

Общедоступные установщики с атрибутом RunInstallerAttribute.Yes не найдены в сборке C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Похоже, в вашем коде нет класса установщика. Это унаследованный класс, Installerкоторый расскажет, installutilкак установить ваш исполняемый файл как сервис.

Ps У меня есть свой собственный маленький самоустанавливающийся / отлаживаемый шаблон Службы Windows, который вы можете скопировать или использовать: Отладочная, Самостоятельная Установка Службы Windows


Когда я щелкаю правой кнопкой мыши проект TestService в Visual Studio -> Свойства -> Службы, страница отключается ... Вы имели в виду другое местоположение? Под Приложением имя сборки - TestService.
— JKH

@John: Игнорируйте первую часть о консоли служб, посмотрите на вторую часть, начинающуюся с Actually . Похоже, что сервис никогда не устанавливался, потому что он не нашел установщика.
— Джеймс Майкл Хэйр

8

Вот альтернативный способ сделать установщик и избавиться от этого сообщения об ошибке. Также кажется, что 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);
        }
    }
}

Я также запустил VS2015, и это решение помогло мне избежать сообщения об ошибке «Нет общедоступных установщиков с RunInstallerAttribute.Yes», ​​которое я получал ранее. Спасибо!
— PHBeagle

6

Две типичные проблемы:

  1. Отсутствует класс ProjectInstaller (как указал @MiguelAngelo)
  2. Командная строка необходимо «Запуск от имени администратора »

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 Edition.


Я знаю, что это 3 года спустя, но это решило мою проблему. Не уверен, почему или когда дизайнер изменил предыдущий открытый частичный класс на внутренний частичный класс. Спасибо!
— мусорщик

2

Stealth Change в VS 2010 и .NET 4.0 и более поздних версиях

Общедоступные установщики с атрибутом RunInstallerAttribute.Yes не найдены

В .NET есть изменение псевдонима или очистка компилятора, которая может выявить эту небольшую настройку для вашего конкретного случая.

Если у вас есть следующий код ...

RunInstaller(true)   // old alias  

Возможно, вам придется обновить его до

RunInstallerAttribute(true)  // new property spelling

Это как псевдоним, измененный под оболочкой во время компиляции или во время выполнения, и вы получите это поведение ошибки. Вышеуказанное явное изменение в RunInstallerAttribute (true) исправило его во всех наших сценариях установки на всех машинах.

После добавления установщика проекта или службы проверьте наличие «старого» RunInstaller (true) и измените его на новый RunInstallerAttribute (true)


Насколько мне известно, вы можете опустить постфикс «Атрибут», то есть [RunInstaller (true)] и [RunInstallerAttribute (true)] одинаковы. Попробуйте использовать другой атрибут, например, [DebuggerStepThrough ()] и [DebuggerStepThroughAttribute ()] - оба будут работать применительно к классу.
— Мэтт

1

Еще одна уловка, с которой я столкнулся: убедитесь, что ваш производный класс Установщика (как правило ProjectInstaller) находится на вершине иерархии пространства имен, я попытался использовать открытый класс в другом открытом классе, но это приводит к той же старой ошибке:

Общедоступные установщики с атрибутом RunInstallerAttribute.Yes не найдены

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.