Установите службу 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.

JKH
источник

Ответы:

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. Командная строка необходимо «Запуск от имени администратора »
fabriciorissetto
источник
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)

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

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

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


источник