Mam standardową usługę Windows .NET napisaną w C #.
Czy może zainstalować się bez używania InstallUtil? Czy powinienem używać klasy instalatora usług? Jak mam tego używać?
Chcę móc zadzwonić do następujących osób:
MyService.exe -install
Będzie to miało taki sam efekt jak wywołanie:
InstallUtil MyService.exe
c#
.net
deployment
windows-services
installutil
Yuval Peled
źródło
źródło
Odpowiedzi:
Tak, to jest w pełni możliwe (czyli dokładnie to robię); wystarczy odwołać się do odpowiedniej biblioteki dll (System.ServiceProcess.dll) i dodać klasę instalatora ...
Oto przykład:
źródło
static void Install(bool undo, string[] args)
definicja poza klasą (itp.). Czy możesz wyjaśnić, jak to wdrożyłeś?Spójrz na InstallHelper sposobie ManagedInstaller klasie. Usługę możesz zainstalować za pomocą:
To jest dokładnie to, co robi InstallUtil. Argumenty są takie same, jak w przypadku InstallUtil.
Zaletą tej metody jest to, że nie powoduje bałaganu w rejestrze i wykorzystuje ten sam mechanizm, co InstallUtil.
źródło
InstallUtil
robi 3. nie musisz zmieniać instalatora na x86 / x64 4. nie zmieniło się to w kilku wersjach .Net - jeśli tak , zostanie odebrany podczas testów i wtedy to naprawię.Zawsze możesz wrócić do starych dobrych wywołań WinAPI, chociaż nakład pracy z tym związany jest nietrywialny. Nie jest wymagane, aby usługi .NET były instalowane za pośrednictwem mechanizmu obsługującego platformę .NET.
Żeby zainstalować:
OpenSCManager
.CreateService
aby zarejestrować usługę.ChangeServiceConfig2
aby ustawić opis.CloseServiceHandle
.Aby odinstalować:
OpenSCManager
.OpenService
.DeleteService
uchwyt zwrócony przezOpenService
.CloseServiceHandle
.Głównym powodem, dla którego wolę to od używania
ServiceInstaller
/ServiceProcessInstaller
jest to, że możesz zarejestrować usługę przy użyciu własnych niestandardowych argumentów wiersza poleceń. Na przykład możesz zarejestrować ją jako"MyApp.exe -service"
, a następnie jeśli użytkownik uruchomi Twoją aplikację bez żadnych argumentów, możesz zaoferować mu interfejs użytkownika do zainstalowania / usunięcia usługi.Uruchomienie reflektora
ServiceInstaller
może uzupełnić brakujące szczegóły w tym krótkim wyjaśnieniu.PS Oczywiście nie będzie to miało „takiego samego efektu, jak wywołanie: InstallUtil MyService.exe” - w szczególności nie będzie można odinstalować za pomocą InstallUtil. Ale wygląda na to, że być może nie był to dla ciebie faktycznie rygorystyczny wymóg.
źródło
Oto klasa, której używam podczas pisania usług. Zwykle mam interaktywny ekran, który pojawia się, gdy usługa nie jest wywoływana. Stamtąd używam klasy w razie potrzeby. Pozwala na wiele nazwanych instancji na tej samej maszynie - stąd pole InstanceID
Przykładowe połączenie
Sama klasa
źródło
GetCurrentProcess
część parametrem i pomyślnie go użyłem. działa świetnie!Powyższe przykłady tak naprawdę nie działały dla mnie, a link do forum jako rozwiązanie nr 1 jest okropny do przekopania. Oto klasa, którą napisałem (częściowo), a druga część jest połączona z tego linku, który znalazłem gdzieś zakopany
Aby zainstalować usługę, uruchom polecenie InstallAndStart w następujący sposób:
Upewnij się, że konto, na którym działa program, ma uprawnienia do instalowania usług. Zawsze możesz „Uruchomić jako administrator” w programie.
Dołączyłem również kilka poleceń dostępu bez interfejsu API, które nie instalują ani nie usuwają usług, ale możesz je wyświetlić i kontrolować kilka (uruchamianie, zatrzymywanie, restartowanie). Naprawdę musisz tylko podnieść uprawnienia do instalowania lub usuwania usług.
Istnieje również kilka poleceń służących do pobierania i ustawiania zmiennych środowiskowych, takich jak
OPENSSL_CONF
lubTEMP
. W większości przypadków parametry i nazwy metod powinny być zrozumiałe.źródło
Unknown = -1, NotFound = 0, Stopped = 1, StartPending = 2, StopPending = 3, Running = 4
W przypadku próby zainstalowania aplikacji wiersza poleceń jako usługi systemu Windows wypróbuj narzędzie „ NSSM ”. Powiązane szczegóły ServerFault można znaleźć tutaj .
źródło
źródło