C # /. NET: Erkennen, ob das Programm als Dienst oder als Konsolenanwendung ausgeführt werden [Duplikat]

StackOverflow https://stackoverflow.com/questions/207896

  •  03-07-2019
  •  | 
  •  

Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              Bin Lauf ich als Service                                      12 Antworten                          
  •     
    

Ich habe ein C # /. NET-Programm, das sowohl als Konsolenanwendung und als Dienst ausgeführt werden kann. Ich gebe es derzeit eine Befehlszeilenoption als Konsolenanwendung zu starten, aber ich möchte, dass vermeiden.

Ist es möglich, programmatisch zu erkennen, ob mein Programm als Dienst gestartet werden?

Wenn es reine Win32, versuche ich als Dienst mit StartServiceCtrlDispatcher beginnen könnte und fallen zurück zu trösten, wenn es ERROR_FAILED_SERVICE_CONTROLLER_CONNECT zurückgekehrt, aber System.ServiceProcess.ServiceBase.Run () erscheint einen errordialog, wenn es fehlschlägt und kehrt dann nur ohne einen Fehler an das Programm signalisiert.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Rasmus, dies ist die frühere Frage .

Aus den Antworten scheint es die beliebteste Art und Weise ist eine einfache Befehlszeilenoption zu verwenden oder versuchen, die Konsole Objekt in einem Try-Catch-Block zugreift (in einem Dienst der Konsole ist nicht auf den Prozess angebracht und versucht, darauf zuzugreifen wirft eine Ausnahme).

Oder wenn Sie Probleme Tests sind mit / den Dienst Debuggen von Code in eine separate DLL-Baugruppe bewegen und einen seprate Testbaum (WinForms / Konsole usw.) erstellen.

(habe gerade bemerkt, dass Jonathan seine Lösung für das Ende der Frage hinzugefügt.)

Andere Tipps

Vielleicht möchten SessionId Eigenschaft des Objekts Process versuchen. Nach meiner Erfahrung ist SessionId auf 0 gesetzt, wenn der Prozess einen Dienst ausgeführt wird.

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
const int STD_OUTPUT_HANDLE = -11;

IntPtr iStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

if (iStdOut == IntPtr.Zero)

{    
    app.RunAsWindowsService = true;

}

// Run as Service
if (runAsWindowsService)                                
{
     // .....
     ServiceBase.Run(myService);
}
else 
{
    // Run as Console
    // Register Ctrl+C Handler...
}

Mit der ParentProcessUtilities Struktur von über einen übergeordneten Prozess zu finden, können Sie dies tun:

static bool RunningAsService() {
    var p = ParentProcessUtilities.GetParentProcess();
    return ( p != null && p.ProcessName == "services" );
}

Beachten Sie, dass der Prozessname für den übergeordneten Prozess beinhaltet nicht die Endung „.exe“.

Ich habe es nicht ausprobiert, aber es ist möglich, dass

ich am Ende erkennen, ob ich nicht in einer Konsolenanwendung wurde durch Überprüfung Console.IsErrorRedirected . Er kehrte „false“ für Konsole-Anwendungen, und „true“ für die Nicht-Konsole apps, die ich getestet. Ich könnte auch IsOutputRedirected verwendet haben.

Ich stelle mir vor es gibt Situationen, in denen diese nicht genau sein wird, aber das funktionierte gut für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top