Zainstaluj usługę Windows utworzoną w programie Visual Studio

136

Kiedy tworzę nową usługę Windows w programie Visual Studio 2010, pojawia się komunikat informujący o konieczności użycia InstallUtil i net start, aby uruchomić usługę.

Próbowałem wykonać następujące czynności:

  1. Utwórz nowy projekt Plik -> Nowy -> Projekt -> Usługa systemu Windows
  2. Nazwa projektu: TestService
  3. Kompiluj projekt bez zmian (konstruktor Service1, OnStart, OnStop)
  4. Otwórz wiersz polecenia, uruchom „C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe” TestService.exe
  5. Uruchom net start TestService .

Wynik kroku 4

Uruchamianie przeprowadzonej instalacji.

Rozpoczynanie fazy instalacji instalacji.

Zobacz zawartość pliku dziennika dla postępu zestawu C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Plik znajduje się w C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Instalowanie zestawu „C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe”.

Dotyczy to następujących parametrów:

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

Nie można znaleźć publicznych instalatorów z atrybutem RunInstallerAttribute.Yes w zestawie C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Faza instalacji zakończyła się pomyślnie i rozpoczyna się faza zatwierdzania.

Zobacz zawartość pliku dziennika dla postępu zestawu C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Plik znajduje się w C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Zatwierdzanie zestawu „C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe”.

Dotyczy to następujących parametrów:

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

Nie można znaleźć publicznych instalatorów z atrybutem RunInstallerAttribute.Yes w zestawie C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Usuń plik InstallState, ponieważ nie ma instalatorów.

Faza zatwierdzania zakończyła się pomyślnie.

Transakcja instalacji została zakończona.

Wynik kroku 5

Nazwa usługi jest nieprawidłowa.

Więcej pomocy można uzyskać, wpisując NET HELPMSG 2185.

jkh
źródło

Odpowiedzi:

243

Musisz otworzyć plik Service.cs w projektancie, kliknąć go prawym przyciskiem myszy i wybrać opcję menu „Dodaj instalator”.

Nie zainstaluje się od razu po wyjęciu z pudełka ... musisz najpierw utworzyć klasę instalatora.

Kilka informacji na temat instalatora usługi:

Instrukcje: dodawanie instalatorów do aplikacji usługowej

Dość stary ... ale o tym mówię:

Usługi systemu Windows w C #: dodawanie instalatora (część 3)

W ten sposób ProjectInstaller.cszostanie automatycznie utworzona wola. Następnie możesz dwukrotnie kliknąć to, wejść do projektanta i skonfigurować komponenty:

  • serviceInstaller1ma właściwości samej usługi: Description, DisplayName, ServiceNamea StartTypeto najważniejsze.

  • serviceProcessInstaller1ma tę ważną właściwość: Accountjest to konto, na którym będzie działać usługa.

Na przykład:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
Miguel Angelo
źródło
3
Dodanie instalatora i ustawienie konta na LocalSystem zrobiło to. Dzięki!
Luc,
1
Otrzymuję ten sam błąd w VS2013. Sprawdziłem podane przez Ciebie linki, upewniłem się, że mam ProjectInstaller, w tym usługę komponentów [Process] Installer1, poprawnie skonfigurowaną. Uruchamiam installutil.exe jako administrator. Nadal zgłasza „Nie znaleziono publicznych instalatorów z atrybutem RunInstallerAttribute.Yes”. Jakieś pomysły?
Barry Dysert,
4
Lol. Podoba mi się, że link „Dość stary” prowadzi do strony o nazwie Arcane Code. Im starsza jest ta strona, tym prawdziwsza staje się nazwa :-)
HotN
Co to jest „projektant”? Aplikacje, które nie mają interfejsu użytkownika, zazwyczaj nie obejmują niczego, co można by nazwać projektantem.
Maxx
Usługi też mają projektanta, podobnie jak formularze
Grungondola
11

Patrzeć na:

Nie można znaleźć publicznych instalatorów z atrybutem RunInstallerAttribute.Yes w zestawie C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Wygląda na to, że możesz nie mieć klasy instalatora w swoim kodzie. Jest to klasa, która dziedziczy po Installerniej i powie, installutiljak zainstalować plik wykonywalny jako usługę.

Ps Mam tutaj własny mały szablon usługi Windows do samodzielnej instalacji / debugowania, z którego można skopiować kod lub użyć go: Debugowalna, samodzielna instalacja usługi Windows

James Michael Hare
źródło
Kiedy klikam prawym przyciskiem myszy projekt TestService w Visual Studio -> Właściwości -> Usługi, strona jest wyłączona ... czy odnosiłeś się do innej lokalizacji? W obszarze Application nazwa zestawu to TestService.
jkh
@John: Zignoruj ​​pierwszą część dotyczącą konsoli usług, spójrz na drugą część, zaczynając od Actually . Wygląda na to, że usługa nigdy nie została zainstalowana, ponieważ nie znalazła instalatora.
James Michael Hare
8

Oto alternatywny sposób na utworzenie instalatora i pozbycie się tego komunikatu o błędzie. Wygląda również na to, że VS2015 express nie ma pozycji menu „Dodaj instalator”.

Wystarczy utworzyć klasę, dodać poniższy kod i dodać odwołanie do 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);
        }
    }
}
kolęda
źródło
Uruchamianie VS2015 również i to rozwiązanie pominęło komunikat o błędzie „Brak publicznych instalatorów z RunInstallerAttribute.Yes”, który otrzymałem wcześniej. Dziękuję Ci!
PHBeagle,
6

Dwa typowe problemy:

  1. Brak klasy ProjectInstaller (jak wskazał @MiguelAngelo)
  2. Wiersza polecenia koniecznością „Uruchom jako administrator
fabriciorissetto
źródło
4

Inny możliwy problem (na który natknąłem się):

Upewnij się, że ProjectInstallerklasa jest public. Szczerze mówiąc, nie jestem pewien, jak dokładnie to zrobiłem, ale dodałem obsługę zdarzeń do ProjectInstaller.Designer.cs:

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

Wydaje mi się, że podczas automatycznego procesu tworzenia funkcji obsługi w ProjectInstaller.csnim zmieniono definicję klasy z

public class ProjectInstaller : System.Configuration.Install.Installer

do

partial class ProjectInstaller : System.Configuration.Install.Installer

zastępując na publicsłowo kluczowe z partial. Tak więc, aby to naprawić, musi być

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

Używam Visual Studio 2013 Community Edition.

John Archer
źródło
Wiem, że to 3 lata później, ale to rozwiązało mój problem. Nie wiem, dlaczego lub kiedy projektant zmienił poprzednią publiczną klasę częściową na wewnętrzną klasę częściową. Dziękuję Ci!
trashrobber
2

Ukryta zmiana w VS 2010 i .NET 4.0 i nowszych

Nie znaleziono publicznych instalatorów z atrybutem RunInstallerAttribute.Yes

Nastąpiła zmiana aliasu lub czyszczenie kompilatora w .NET, które może ujawnić tę małą modyfikację dla twojego konkretnego przypadku.

Jeśli masz następujący kod…

RunInstaller(true)   // old alias  

Może być konieczne zaktualizowanie go do

RunInstallerAttribute(true)  // new property spelling

To jest jak alias zmieniony pod okładkami w czasie kompilacji lub w czasie wykonywania, a otrzymasz takie zachowanie błędu. Powyższa jawna zmiana RunInstallerAttribute (true) naprawiła to we wszystkich naszych scenariuszach instalacji na wszystkich komputerach.

Po dodaniu instalatora projektu lub usługi sprawdź, czy nie ma „starego” RunInstaller (true) i zmień go na nowy RunInstallerAttribute (true)

Sql Surfer
źródło
Zgodnie z moją wiedzą można pominąć przyrostek "Attribute", tzn. [RunInstaller (true)] i [RunInstallerAttribute (true)] są takie same. Spróbuj z innym atrybutem, np. [DebuggerStepThrough ()] i [DebuggerStepThroughAttribute ()] - oba będą działać po zastosowaniu do klasy.
Matt,
1

Kolejny haczyk, na który natknąłem się: upewnij się, że klasa pochodna Instalatora (zwykle ProjectInstaller) znajduje się na szczycie hierarchii przestrzeni nazw, próbowałem użyć klasy publicznej w innej klasie publicznej, ale powoduje to ten sam stary błąd:

Nie znaleziono publicznych instalatorów z atrybutem RunInstallerAttribute.Yes


źródło