Dlatego stworzyliśmy usługę Windows do dostarczania danych do naszej aplikacji klienckiej i wszystko idzie świetnie. Klient wymyślił zabawne żądanie konfiguracji, które wymaga dwóch wystąpień tej usługi działających na tym samym serwerze i skonfigurowanych do wskazywania oddzielnych baz danych.
Do tej pory nie byłem w stanie tego zrobić i miałem nadzieję, że moi koledzy z stackoverflow mogą dać kilka wskazówek, dlaczego.
Obecne ustawienia:
Skonfigurowałem projekt, który zawiera usługę systemu Windows, od teraz będziemy go nazywać AppService i plik ProjectInstaller.cs, który obsługuje niestandardowe kroki instalacji, aby ustawić nazwę usługi na podstawie klucza w pliku App.config :
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
W tym przypadku Util jest po prostu klasą statyczną, która ładuje nazwę usługi z pliku konfiguracyjnego.
Odtąd próbowałem zainstalować obie usługi na dwa różne sposoby i obie zakończyły się niepowodzeniem w identyczny sposób.
Pierwszym sposobem było po prostu zainstalowanie pierwszej kopii usługi, skopiowanie zainstalowanego katalogu i zmiana jego nazwy, a następnie uruchomienie następującego polecenia po zmodyfikowaniu konfiguracji aplikacji, aby zmienić żądaną nazwę usługi:
InstallUtil.exe /i AppService.exe
Kiedy to nie zadziałało, próbowałem stworzyć drugi projekt instalatora, wyedytowałem plik konfiguracyjny i zbudowałem drugi instalator. Kiedy uruchomiłem instalator, działało dobrze, ale usługa nie pojawiła się w services.msc, więc uruchomiłem poprzednie polecenie dla drugiej zainstalowanej bazy kodu.
Za każdym razem otrzymałem następujące dane wyjściowe z InstallUtil (tylko odpowiednie części):
Uruchamianie przeprowadzonej instalacji.
Rozpoczynanie fazy instalacji instalacji.
Instalowanie usługi App Service Two ... Usługa App Service Two została pomyślnie zainstalowana. Tworzenie źródła EventLog App Service Two w dzienniku aplikacji ...
Wystąpił wyjątek podczas fazy instalacji. System.NullReferenceException: odwołanie do obiektu nie jest ustawione na wystąpienie obiektu.
Rozpoczyna się faza wycofywania instalacji.
Przywracanie dziennika zdarzeń do poprzedniego stanu dla źródłowej usługi App Service Two. Usługa Service App Service 2 jest usuwana z systemu ... Service App Service 2 została pomyślnie usunięta z systemu.
Faza wycofywania została zakończona pomyślnie.
Transakcja instalacji została zakończona. Instalacja nie powiodła się i przywrócenie zostało wykonane.
Przepraszamy za rozwlekły post, chciałem się upewnić, że jest wystarczająco dużo istotnych informacji. Element, który do tej pory mnie zaskoczył, to stwierdzenie, że instalacja usługi zakończyła się pomyślnie i dopiero po utworzeniu źródła EventLog wydaje się, że NullReferenceException zostaje wyrzucony. Więc jeśli ktoś wie, co robię źle lub ma lepsze podejście, będzie to bardzo wdzięczne.
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
. Możesz wstawić kod do instalatora, aby uzyskać żądaną nazwę usługi po uruchomieniu installutil.