Установите службу Windows, созданную в Visual Studio - PullRequest
130 голосов
/ 28 октября 2011

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

Я попытался выполнить следующие шаги:

  1. Создать новый проект Файл -> Новый -> Проект -> Служба Windows
  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 \ Project.s \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Установка сборки 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Проекты \ 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 \ Проекты \ 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 \ Проекты \ 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.Атрибут Да может быть найден в сборке C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

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

Фаза подтверждения успешно завершена.

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

Вывод шага 5

Службаимя неверно.

Для получения дополнительной справки введите NET HELPMSG 2185.

Ответы [ 7 ]

230 голосов
/ 28 октября 2011

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

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

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

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

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

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

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

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

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

Например:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
11 голосов
/ 28 октября 2011

Просмотр:

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

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

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

8 голосов
/ 03 ноября 2016

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

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

  1. Отсутствует класс ProjectInstaller (как указал @MiguelAngelo)
  2. Командная строка должна «Запускать от имени Администратор
3 голосов
/ 28 июля 2016

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

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

2 голосов
/ 22 января 2017

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

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

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

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

RunInstaller(true)   // old alias  

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

RunInstallerAttribute(true)  // new property spelling

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

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

1 голос
/ 26 марта 2019

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

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

...