usuario una tipos sharp que por net generar existen excepción excepciones excepcion errores elevar definidas como capturar c# .net service

c# - tipos - que es una excepción en c sharp



C#/. NET: detecta si el programa se está ejecutando como un servicio o una aplicación de consola (8)

No lo he probado, pero es posible que Process.GetCurrentProcess ayude: en el modo consola, el nombre del proceso sería el mismo que el ejecutable, mientras que esperaría (y nuevamente, ¡por favor, compruebe!) Que cuando se ejecuta como un servicio sería diferente

Esta pregunta ya tiene una respuesta aquí:

Tengo un programa C # / .NET que se puede ejecutar como una aplicación de consola y como un servicio. Actualmente le doy una opción de línea de comandos para comenzar como una aplicación de consola, pero me gustaría evitar eso.

¿Es posible detectar mediante programación si mi programa se está iniciando como un servicio?

Si fuera Win32 puro, podría intentar comenzar como un servicio con StartServiceCtrlDispatcher y volver a la consola si devolviera ERROR_FAILED_SERVICE_CONTROLLER_CONNECT, pero System.ServiceProcess.ServiceBase.Run () muestra un errordialog si falla y luego simplemente regresa sin indicar un error al programa

¿Algunas ideas?


No sé si esto funcionará, pero puede intentar usar PInvoke con este código y verificar si el padre es "services.exe".



[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... }


Terminé detectando si estaba o no en una aplicación de consola al marcar Console.IsErrorRedirected . Se devolvió "falso" para las aplicaciones de la consola y "verdadero" para las aplicaciones que no son de consola que probé. También podría haber usado IsOutputRedirected .

Me imagino que hay circunstancias en las que estas no serán precisas, pero esto funcionó bien para mí.


Es posible que desee probar la propiedad SessionId del objeto Process. En mi experiencia SessionId se establece en 0 si el proceso está ejecutando un servicio.


Rasmus, esta es la pregunta anterior .

De las respuestas parece que la forma más popular es usar una simple opción de línea de comando o intentar acceder al objeto de consola en un bloque try catch (en un servicio la consola no está conectada al proceso e intentar acceder arroja una excepción) .

O si tiene problemas para probar / depurar el servicio, mueva el código a un ensamblaje dll diferente y cree un arnés de prueba de seprate (winforms / console, etc.).

(Me acabo de dar cuenta de que Jonathan ha agregado su solución al final de la pregunta).


Utilizando la estructura ParentProcessUtilities de esta respuesta sobre cómo encontrar un proceso principal, puede hacer esto:

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

Tenga en cuenta que el nombre del proceso para el proceso principal no incluye la extensión ".exe".