Встановіть службу Windows, створену в Visual Studio

Коли я створюю нову службу Windows у Visual Studio 2010, я отримую повідомлення про використання InstallUtil, і мережа запускає запуск сервісу.

Я спробував виконати наступні кроки:

  1. Create new project File -> New -> Project -> Windows Service
  2. Project Name: TestService
  3. Build project as is (Service1 constructor, OnStart, OnStop)
  4. Open command prompt, run "C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" TestService.exe
  5. Run 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 \ TestService \ 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   монтаж.

     

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

     

Переглянути зміст файлу журналу для   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 \ TestService \ 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.

117

6 Відповіді

Вам потрібно відкрити файл Service.cs у конструкторе, клацнути правою кнопкою миші та вибрати опцію меню «Додати установника».

Він не буде встановлюватися прямо з коробки ... вам спочатку потрібно створити клас установки.

Деякі посилання на встановлювач служб:

Як: встановити додатки для вашого додатка служби

Досить старий ... але це про що я говорю:

Служби Windows в C #: Додавання установника (частина 3)

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

  • serviceInstaller1 має властивості самої служби: Description , DisplayName , ServiceName код> StartType є найважливішими.

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

Наприклад:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
215
додано
Я отримую таку ж помилку у VS2013. Я перевірив посилання, які ви надали, перевірили, що у мене є ProjectInstaller, включаючи компонент служби [Process] Installer1, належним чином налаштований. Я запускаю installutil.exe в якості адміністратора. Він як і раніше повідомляє "Жодна загальнодоступна програма установки з атрибутом RunInstallerAttribute.Yes не може бути знайдено". Будь-які ідеї?
додано Автор Barry Dysert, джерело
Лол. Мені дуже подобається, що посилання "Дуже стара" на сайт "Arcane Code". Чим старша ця сторінка отримує, тим іменніше це стає :-)
додано Автор HotN, джерело
Додавання програми встановлення та налаштування облікового запису на LocalSystem зробили це. Дякую!
додано Автор Luc, джерело

Дивлячись на:

Жоден загальнодоступний інсталятор з атрибутом RunInstallerAttribute.Yes не міг знайти в збірці C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Схоже, у вашому коді може не бути класу встановлювача. Це клас, який успадковує від Installer , який повідомить installutil , як встановити виконуваний файл як службу.

P.s. I have my own little self-installing/debuggable Windows Service template here which you can copy code from or use: Debuggable, Self-Installing Windows Service

11
додано
Коли я клацну правою кнопкою миші на проекті TestService у Visual Studio -> Властивості -> Сервіси, ця сторінка вимкнена ... чи ви мали на увазі інше місце? У розділі «Застосування» назва Асамблеї - «Тест-сервіс».
додано Автор jkh, джерело
@ Джон: ігноруйте першу частину консолі служб, подивіться на другу частину, починаючи з фактично . Схоже, сервіс ніколи не встановлено, оскільки він не знайшов встановлювача.
додано Автор James Michael Hare, джерело

Ось альтернативний спосіб зробити інсталятор і позбутися цього повідомлення про помилку. Також здається, що 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);
        }
    }
}
8
додано
Запуск VS2015 також містив мене в минулому повідомлення про помилку "Без публічних установників з повідомленням про помилку RunInstallerAttribute.Yes", яку я раніше отримував. Дякую!
додано Автор PHBeagle, джерело

Ще одна можлива проблема (що я побіг):

Переконайтеся, що клас ProjectInstaller є public . Чесно кажучи, я не знаю, як саме я це зробив, але додавав обробників подій до ProjectInstaller.Designer.cs , наприклад:

this.serviceProcessInstaller1.BeforeInstall + = new System.Configuration.Install.InstallEventHandler (this.serviceProcessInstaller1_BeforeInstall);

Я думаю, під час автоматичного процесу створення функції обробника в ProjectInstaller.cs він змінив визначення класу з

відкритого класу ProjectInstaller: System.Configuration.Install.Installer

до

часткового класу ProjectInstaller: System.Configuration.Install.Installer

replacing the public keyword with partial. So, in order до fix it it must be

загальнодоступний частковий клас ProjectInstaller: System.Configuration.Install.Installer

Я використовую спільноту Visual Studio 2013.

3
додано

Дві типові проблеми:

  1. Відсутній клас ProjectInstaller (як вказав @MiguelAngelo)
  2. Командний рядок має "Запустити як Адміністратор "
3
додано

Зміна Stealth в VS 2010 і .NET 4.0 і пізніших

No public installers with the RunInstallerAttribute.Yes attribute could be found

Існує зміна псевдоніма або очищення компілятора в .NET, який може виявити цей трохи налаштування для вашого конкретного випадку.

Якщо у вас є такий код ...

RunInstaller(true)  //old alias  

Вам може знадобитися оновити його

RunInstallerAttribute(true) //new property spelling

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

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

1
додано
На мій погляд, можна опустити постфікс "Атрибут", тобто [RunInstaller (true)] і [RunInstallerAttribute (true)] однаковий. Спробуйте його з іншим атрибутом, наприклад [DebuggerStepThrough ()] і [DebuggerStepThroughAttribute ()] - обидва будуть працювати при застосуванні до класу.
додано Автор Matt, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug