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

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

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

  1. Создать новый проект File -> New -> Project -> Windows Service
  2. Название проекта: TestService
  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

путь к сборке = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

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

Фаза установки завершена успешно, и начинается фаза фиксации.

Просмотрите содержимое файла журнала для прогресса сборки 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

путь к сборке = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

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

Удалите файл InstallState, потому что нет установщиков.

Фаза фиксации завершена успешно.

Транзакционная установка завершена.

Результат этапа 5

Имя службы недействительно.

Дополнительную помощь можно получить, набрав NET HELPMSG 2185.


person jkh    schedule 27.10.2011    source источник


Ответы (7)


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

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

Справочник по установщику службы:

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

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

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

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

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

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

Например:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
person Miguel Angelo    schedule 27.10.2011
comment
Добавление установщика и настройка учетной записи на LocalSystem сделали это. Спасибо! - person Luc; 10.01.2013
comment
Я получаю ту же ошибку в VS2013. Я проверил предоставленные вами ссылки и убедился, что у меня правильно настроен ProjectInstaller, включая службу компонентов [Process] Installer1. Я запускаю installutil.exe от имени администратора. Он по-прежнему сообщает, что не удалось найти общедоступных установщиков с атрибутом RunInstallerAttribute.Yes. Любые идеи? - person Barry Dysert; 06.09.2014
comment
Ржу не могу. Мне нравится, что довольно старая ссылка ведет на сайт под названием Arcane Code. Чем старше становится эта страница, тем точнее становится имя :-) - person HotN; 28.04.2016
comment
Какой дизайнер? Приложения, у которых нет пользовательского интерфейса, обычно не включают ничего, что можно было бы назвать дизайнером. - person Maxx; 17.04.2019
comment
У сервисов тоже есть дизайнер, как и у форм - person Grungondola; 17.09.2019

Смотря на:

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

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

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

person James Michael Hare    schedule 27.10.2011
comment
Когда я щелкаю правой кнопкой мыши проект TestService в Visual Studio - ›Свойства -› Службы, страница отключается ... Вы имели в виду другое место? В разделе «Приложение» имя сборки - TestService. - person jkh; 28.10.2011
comment
@John: Не обращайте внимания на первую часть консоли служб, посмотрите на вторую часть, начинающуюся с Фактически. Похоже, служба так и не была установлена, потому что не нашла установщика. - person James Michael Hare; 28.10.2011

Вот альтернативный способ создать установщик и избавиться от этого сообщения об ошибке. Также кажется, что 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);
        }
    }
}
person Carol    schedule 03.11.2016
comment
Я также запустил VS2015, и это решение помогло мне пройти мимо общедоступных установщиков с сообщением об ошибке RunInstallerAttribute.Yes, которое я получал ранее. Спасибо! - person PHBeagle; 08.03.2017

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

  1. Отсутствует класс ProjectInstaller (как указал @MiguelAngelo)
  2. В командной строке должно быть указано «Запуск от имени администратора».
person fabriciorissetto    schedule 29.08.2015

Еще одна возможная проблема (с которой я столкнулся):

Убедитесь, что класс 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

to

partial class ProjectInstaller : System.Configuration.Install.Installer

заменяя ключевое слово public на partial. Итак, чтобы исправить это, он должен быть

public partial class ProjectInstaller : System.Configuration.Install.Installer

Я использую Visual Studio 2013 Community edition.

person John Archer    schedule 28.07.2016
comment
Я знаю, что это 3 года спустя, но это решило мою проблему. Не знаю, почему и когда дизайнер изменил предыдущий общедоступный частичный класс на внутренний частичный класс. Спасибо! - person trashrobber; 31.10.2019

Изменение скрытности в VS 2010, .NET 4.0 и более поздних версиях

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

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

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

RunInstaller(true)   // old alias  

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

RunInstallerAttribute(true)  // new property spelling

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

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

person Sql Surfer    schedule 22.01.2017
comment
Насколько мне известно, постфикс атрибута можно опустить, т.е. [RunInstaller (true)] и [RunInstallerAttribute (true)] одинаковы. Попробуйте использовать другой атрибут, например [DebuggerStepThrough ()] и [DebuggerStepThroughAttribute ()] - оба будут работать при применении к классу. - person Matt; 08.11.2017

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

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

person Community    schedule 26.03.2019