2010-09-17 18 views
9

Tworzymy aplikację Windows Presentation Foundation, którą chcielibyśmy uruchomić jako usługę Windows.Uruchamianie aplikacji WPF jako usługi systemu Windows

Ktoś zrobił coś takiego?
Czy to możliwe?

Nie musimy wchodzić w interakcje z Pulpitem lub jakimkolwiek interfejsem graficznym, byłoby po prostu fajnie mieć jedną Aplikację, którą możemy uruchomić z GUI, z Linii Komend (która działa) lub jako Usługa.

Czekamy na ciekawym wejściem :-)

Odpowiedz

12

Jako zasada kciuka usług nie powinna mieć jakiegokolwiek UI. Dzieje się tak dlatego, że usługi zwykle działają z bardzo wysokimi uprawnieniami, a złe rzeczy mogą się zdarzyć, jeśli nie jesteś bardzo ostrożny z danymi wejściowymi. (Wydaje mi się, że najnowsze wersje systemu Windows nie pozwalają na utworzenie interfejsu użytkownika z usługi, ale nie jestem w 100% pewny.)

Jeśli potrzebujesz komunikować się z usługą, powinieneś użyć jakiejś formy IPC (WCF, rury, gniazda,   ...). Jeśli chcesz prosty program konsoli, który może być również usługę, znam trick ustawić, że się:

class MyExampleApp : ServiceBase 
{ 
    public static void Main(string[] args) 
    { 
     if (args.Length == 1 && args[0].Equals("--console")) 
     { 
      new MyExampleApp().ConsoleRun(); 
     } 
     else 
     { 
      ServiceBase.Run(new MyExampleApp()); 
     } 
    } 
    private void ConsoleRun() 
    { 
     Console.WriteLine(string.Format("{0}::starting...", GetType().FullName)); 

     OnStart(null); 

     Console.WriteLine(string.Format("{0}::ready (ENTER to exit)", GetType().FullName)); 
     Console.ReadLine(); 

     OnStop(); 

     Console.WriteLine(string.Format("{0}::stopped", GetType().FullName)); 
    } 
    //snip 
} 

Jeśli wystarczy uruchomić program, uruchomi jako usługa (i krzyczeć na ciebie, jeśli uruchamiasz go z konsoli), ale jeśli dodasz parametr --console podczas uruchamiania, program uruchomi się i poczeka na naciśnięcie klawisza Enter, aby zamknąć.

+0

To jest dobre dla CLI i usługi. –

+0

Dzięki za kod. W celu zrozumienia części OnStop musisz zagłębić się w tematykę usług. – Remy

0

Jeśli już działasz z poziomu wiersza poleceń, jesteś w połowie drogi. Niektóre aplikacje mają proste oznaczenia flag, których używasz, gdy chcesz uruchomić aplikację jako usługę, sprawdź te flagi i przeprowadź odpowiednią logikę. Coś jak:

myapp.exe --runservice 
+0

Nie zła rada, ale zazwyczaj lepiej jest uruchamiać CLI jako usługę domyślnie. Upraszcza instalację. –

3

nie rób tego. Zapisz wszystkie wnętrzności w zespole silnika, a następnie odwołaj się do niego za pomocą interfejsu GUI i usługi. CLI może być albo trzecim plikiem wykonywalnym, albo ponownym użyciem pliku wykonywalnego usługi. Kluczem jest umożliwienie uruchomienia usługi bez odwoływania się do WPF lub WinForm lub jakiegokolwiek innego interfejsu GUI, z którego korzystasz.

+0

Myślałem też o tym. Brzmi jak rozsądne rozwiązanie. Ale dlaczego odwołanie do WPF lub WinForm jest złe? Tak długo, jak jest to tylko odniesienie? – Remy

+0

@Remy: Statyczny odnośnik ładuje zespół na początku. –

0

Moje rozwiązanie jest dodać funkcję wejścia głównego, jak:

public static void Main() 
{ 
    ServiceBase.Run(new MyService()); 
} 

Teraz mamy dwa wejścia uruchamiania aplikacji, jeden dla WPF, jeden dla Windows Usługi;

Możemy skonfigurować obiekt startowy w Visual Studio -> Właściwość projektu -> Aplikacja -> Obiekt startowy.

Tak ustawiając wpis i przebudowę, dostaniesz to, czego potrzebujesz.

Powiązane problemy