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


136

Коли я створюю нову службу 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. Запустіть чистий старт 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: \ Користувачі \ ім'я користувача \ Документи \ Visual Studio 2010 \ Проекти \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe".

Змінені параметри:

logtoconsole =

logfile = C: \ Users \ myusername \ Документи \ Visual Studio 2010 \ Проекти \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

Assemblypath = C: \ Користувачі \ myusername \ Документи \ 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 \ 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 \ Документи \ Visual Studio 2010 \ Проекти \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

Assemblypath = C: \ Користувачі \ myusername \ Документи \ 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.

Видаліть файл InstallState, оскільки інсталяторів немає.

Етап Комітету завершився успішно.

Укладена трансакційна установка завершена.

Висновок кроку 5

Назва послуги недійсна.

Додаткову допомогу можна отримати, ввівши NET HELPMSG 2185.

Відповіді:


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 не вдалося знайти". Будь-які ідеї?
Barry Dysert

4
Лол. Мені подобається, що посилання "Досить старе" на сайт, який називається Arcane Code. Чим старша ця сторінка стає тим, що ім'я стає правдою :-)
HotN

Що таке "конструктор"? Програми, які не мають інтерфейсу, зазвичай не передбачають нічого, що можна було б назвати дизайнером.
Макс

Послуги також мають дизайнера, як і форми
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: Ігноруйте першу частину про консоль служб, подивіться другу частину, починаючи з Насправді . Схоже, сервіс ніколи не встановлювався, оскільки не знайшов інсталятора.
Джеймс Майкл Заєць

8

Ось альтернативний спосіб зробити інсталятор та позбутися цього повідомлення про помилку. Також здається, що у експресі VS2015 немає пункту меню "Додати інсталятор".

Вам просто потрібно створити клас і додати код нижче та додати посилання 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. Командний рядок необхідно «Запуск від імені адміністратора »

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.


Я знаю, що це через 3 роки, але це вирішило мою проблему. Не впевнені, чому або коли дизайнер змінив попередній публічний частковий клас на внутрішній частковий клас. Дякую!
trashrobber

2

Стійкі зміни у VS 2010 та .NET 4.0 та новіших версіях

Не вдалося знайти публічних установців з атрибутом RunInstallerAttribute.Yes

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

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

RunInstaller(true)   // old alias  

Можливо, вам потрібно буде оновити його

RunInstallerAttribute(true)  // new property spelling

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

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


Згідно з моїми знаннями, ви можете опустити постфікс "Attribute", тобто [RunInstaller (true)] і [RunInstallerAttribute (true)] те саме. Спробуйте його з іншим атрибутом, наприклад [DebuggerStepThrough ()] та [DebuggerStepThroughAttribute ()] - обидва будуть працювати при застосуванні до класу.
Метт

1

Ще одна уловка, на яку я зіткнувся: забезпечте свій похідний інсталятор (як правило, ProjectInstaller ) знаходиться у верхній частині ієрархії простору імен, я намагався використовувати публічний клас в іншому публічному класі, але це призводить до тієї ж старої помилки:

Не вдалося знайти публічних установців з атрибутом RunInstallerAttribute.Yes

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.