Установка службы 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)