Mam aplikację konsolową i chciałbym ją uruchomić jako usługę Windows. VS2010 posiada szablon projektu, który umożliwia dołączenie projektu konsoli i zbudowanie usługi Windows. Chciałbym nie dodawać oddzielnego projektu usługi i jeśli to możliwe zintegrować kod usługi z aplikacją konsolową, aby aplikacja konsolowa była jednym projektem, który mógłby działać jako aplikacja konsoli lub jako usługa systemu Windows, gdyby była uruchamiana na przykład z wiersza poleceń za pomocą przełączników.
Może ktoś mógłby zasugerować bibliotekę klas lub fragment kodu, który mógłby szybko i łatwo przekształcić aplikację konsoli C # w usługę?
Odpowiedzi:
Zwykle używam następującej techniki, aby uruchomić tę samą aplikację jako aplikację konsolową lub jako usługę:
Environment.UserInteractive
jest zwykle prawdziwe dla aplikacji konsolowej i fałszywe dla usługi. Technicznie rzecz biorąc, możliwe jest uruchomienie usługi w trybie interaktywnym użytkownika, więc zamiast tego można sprawdzić przełącznik wiersza polecenia.źródło
Odniosłem wielki sukces z TopShelf .
TopShelf to pakiet Nuget zaprojektowany, aby ułatwić tworzenie aplikacji .NET Windows, które mogą działać jako aplikacje konsolowe lub jako usługi Windows. Możesz szybko podłączyć zdarzenia, takie jak zdarzenia Start i Stop usługi, skonfigurować za pomocą kodu, np. Ustawić konto, na którym działa, skonfigurować zależności z innymi usługami i skonfigurować sposób odzyskiwania po błędach.
Z konsoli Menedżera pakietów (Nuget):
Zapoznaj się z przykładami kodu, aby rozpocząć.
Przykład:
TopShelf zajmuje się również instalacją serwisową, co pozwala zaoszczędzić sporo czasu i usuwa standardowy kod z Twojego rozwiązania. Aby zainstalować plik .exe jako usługę, po prostu wykonaj następujące czynności w wierszu polecenia:
Nie musisz podłączać ServiceInstallera i tak dalej - TopShelf zrobi to wszystko za Ciebie.
źródło
Oto pełna instrukcja:
* InstallUtil.exe można zwykle znaleźć tutaj: C: \ windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.ex e
Program.cs
MyService.cs
MyServiceInstaller.cs
źródło
Słyszę, że chcesz, aby jeden zestaw zatrzymywał powtarzający się kod, ale byłoby to najprostsze i ograniczyło powtarzanie kodu i ułatwiłoby ponowne użycie kodu w inny sposób w przyszłości, jeśli ...... podzielisz go na 3 zespoły.
źródło
Start()
iStop()
metody, a aplikacja konsolowa ma pętlę. Oprócz korzystania z frameworka, takiego jak TopShelf , jest to najlepsza opcjaOto nowszy sposób przekształcania aplikacji konsoli w usługę systemu Windows jako usługę roboczą w oparciu o najnowszy .Net Core 3.1 .
Jeśli utworzysz usługę Worker Service z programu Visual Studio 2019, da ci ona prawie wszystko, czego potrzebujesz do utworzenia usługi Windows po wyjęciu z pudełka, co również musisz zmienić na aplikację konsolową, aby przekonwertować ją na usługę Windows.
Oto zmiany, które musisz wprowadzić:
Zainstaluj następujące pakiety NuGet
Zmień Program.cs, aby miał implementację taką jak poniżej:
i dodaj Worker.cs, gdzie umieścisz kod, który będzie uruchamiany przez operacje serwisowe:
Gdy wszystko jest gotowe, a aplikacja została pomyślnie zbudowana, możesz użyć programu sc.exe, aby zainstalować aplikację konsoli exe jako usługę systemu Windows za pomocą następującego polecenia:
źródło
Możesz użyć
I pojawi się na liście usług. Nie wiem jednak, czy to działa poprawnie. Usługa zwykle musi słuchać kilku wydarzeń.
Istnieje jednak kilka opakowań usług, które mogą uruchamiać dowolną aplikację jako prawdziwą usługę. Na przykład Microsofts SrvAny z zestawu zasobów Win2003
źródło
Najpierw osadzam rozwiązanie aplikacji konsoli w rozwiązaniu usługowym systemu Windows i odnoszę się do niego.
Następnie upubliczniam klasę Program aplikacji konsoli
Następnie tworzę dwie funkcje w aplikacji konsoli
Następnie w samej usłudze Windows tworzę instancję programu i wywołuję funkcje Start i Stop dodane w ramach OnStart i OnStop. Zobacz poniżej
To podejście można również zastosować w przypadku hybrydy aplikacji systemu Windows / usługi systemu Windows
źródło
Może powinieneś zdefiniować, czego potrzebujesz, o ile wiem, nie możesz jednocześnie uruchamiać aplikacji jako konsoli lub usługi z wierszem poleceń. Pamiętaj, że usługa jest zainstalowana i musisz ją uruchomić w Menedżerze usług, możesz utworzyć nową aplikację, która uruchomi usługę lub uruchomi nowy proces z uruchomioną aplikacją konsoli. Ale jak napisałeś
Kiedyś byłem na twoim miejscu, zamieniając aplikację konsoli w usługę. Najpierw potrzebujesz szablonu, jeśli pracujesz z VS Express Edition. Oto łącze, w którym możesz postawić pierwsze kroki: Usługa C # Windows , to było dla mnie bardzo pomocne. Następnie za pomocą tego szablonu dodaj swój kod do żądanych zdarzeń usługi.
Aby ulepszyć usługę, możesz zrobić jeszcze jedną rzecz, ale nie jest to szybkie i / lub łatwe, polega na używaniu domen aplikacji i tworzeniu bibliotek dll do ładowania / wyładowywania. W jednym możesz rozpocząć nowy proces za pomocą aplikacji konsolowej, aw innym dll możesz po prostu umieścić funkcjonalność, którą ma wykonać usługa.
Powodzenia.
źródło
Musisz podzielić funkcjonalność na klasę lub klasy i uruchomić ją za pomocą jednego z dwóch kodów pośredniczących. Kod pośredniczący konsoli lub kod serwisowy.
Jak widać, podczas uruchamiania systemu Windows niezliczone usługi składające się na infrastrukturę nie prezentują (i nie mogą bezpośrednio) przedstawiać użytkownikowi okien konsoli. Usługa musi komunikować się z użytkownikiem w sposób nie graficzny: za pośrednictwem SCM; w dzienniku zdarzeń, do jakiegoś pliku dziennika itp. Usługa będzie musiała również komunikować się z oknami za pośrednictwem SCM, w przeciwnym razie zostanie wyłączona.
Oczywiście byłoby do zaakceptowania posiadanie aplikacji konsolowej, która może komunikować się z usługą, ale usługa musi działać niezależnie, bez konieczności interakcji z GUI.
Konsola może być bardzo przydatna do debugowania zachowania usługi, ale nie powinna być używana w środowisku „produkcyjnym”, które w końcu jest celem tworzenia usługi.
Nie przeczytałem go w pełni, ale ten artykuł wydaje się zmierzać w dobrym kierunku.
źródło
Używam klasy usług, która jest zgodna ze standardowym wzorcem zalecanym przez
ServiceBase
i dołączam pomocników do łatwego debugowania F5. Dzięki temu dane serwisowe są zdefiniowane w ramach usługi, dzięki czemu są one łatwe do znalezienia, a ich żywotność jest łatwa do zarządzania.Zwykle tworzę aplikację Windows o poniższej strukturze. Nie tworzę aplikacji konsolowej; w ten sposób nie widzę dużego czarnego pudełka na twarzy za każdym razem, gdy uruchamiam aplikację. Pozostaję w debugerze, gdzie jest cała akcja. używam
Debug.WriteLine
aby wiadomości trafiały do okna wyjściowego, które ładnie się dokuje i pozostaje widoczne po zakończeniu działania aplikacji.Zwykle nie kłopoczę się dodawaniem kodu debugującego do zatrzymywania; Zamiast tego używam debugera. Jeśli muszę debugować zatrzymanie, tworzę projekt jako aplikację konsolową, dodaję
Stop
metodę przekazywania i wywołuję ją po wywołaniuConsole.ReadKey
.źródło