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:
- Utwórz nowy projekt Plik -> Nowy -> Projekt -> Usługa systemu Windows
- Nazwa projektu: TestService
- Kompiluj projekt bez zmian (konstruktor Service1, OnStart, OnStop)
- Otwórz wiersz polecenia, uruchom „C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe” TestService.exe
- 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.
Patrzeć na:
Wygląda na to, że możesz nie mieć klasy instalatora w swoim kodzie. Jest to klasa, która dziedziczy po
Installer
niej i powie,installutil
jak 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
źródło
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.
źródło
Dwa typowe problemy:
źródło
Inny możliwy problem (na który natknąłem się):
Upewnij się, że
ProjectInstaller
klasa jestpublic
. Szczerze mówiąc, nie jestem pewien, jak dokładnie to zrobiłem, ale dodałem obsługę zdarzeń doProjectInstaller.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.cs
nim zmieniono definicję klasy zpublic class ProjectInstaller : System.Configuration.Install.Installer
do
partial class ProjectInstaller : System.Configuration.Install.Installer
zastępując na
public
słowo kluczowe zpartial
. Tak więc, aby to naprawić, musi byćpublic partial class ProjectInstaller : System.Configuration.Install.Installer
Używam Visual Studio 2013 Community Edition.
źródło
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…
Może być konieczne zaktualizowanie go do
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)
źródło
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