¿Cómo saber si se llama al método de servicio de Windows en .Net (administrado) Código

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

  •  06-09-2019
  •  | 
  •  

Pregunta

¿Cómo puedo saber si un método que estoy escribiendo en código administrado está siendo llamada desde una aplicación interactiva vs un servicio de Windows?

¿Fue útil?

Solución 2

Creo que pude haber dado cuenta de esto (al menos esto funciona para mis necesidades - su experiencia puede variar dependiendo de lo que está tratando de hacer). Hay una propiedad colgando fuera del objeto de Medio Ambiente denominado "UserInteractive". Se le indica si está o no se está ejecutando en un contexto con acceso al escritorio.

Otros consejos

¿Qué parte de un servicio de Windows es lo que quiere saber? O qué parte de una aplicación interactiva es lo que no quiere saber? Lo que realmente importa a usted?


Cada vez que escucho una solicitud de este tipo, es casi siempre un error en el diseño. Yo sugeriría un par de respuestas:

  1. Que la persona que llama que diga lo que formateador de uso, o
  2. Coloque el nombre de la clase de formateador en un archivo de configuración. Tienen todos los formateadores implementar la misma interfaz. En tiempo de ejecución, la primera vez que necesite un formateador, crear una instancia de la especificada en el archivo de configuración, y lo llaman a través de la interfaz común.
  3. No reinventar la rueda. Utilice las clases en System.Diagnostics, que, de hecho, configurar mucho a mi # 2.

Es casi siempre un error de código para ser sensible al contexto en el que se llamaba.

Existen al menos 2 maneras de hacer esto:

  1. "System.Reflection.Assembly.GetCallingAssembly (). NombreCompleto" devolverá el nombre del ensamblado que está llamando a su código.
  2. "Environment.StackTrace" devolverá la traza completa de quién está llamando su código. Debe ver a su vocación nombre del método en la cadena.

Se pueden definir dos registrador diferentes: una para aplicaciones interactivas y uno para el servicio de ventanas. y dejar que el cliente elija qué registrador que quiere usar el uso de un archivo de configuración. Usted también puede tener un registrador por defecto si los clientes elige un registrador mal o se olvida de configurar. Creo que debería ser una mejor idea tener funcionalidades como la tala y el mensaje de formato para ser configurable.

No sé si hay una posibilidad de orden interna, pero echar un vistazo a la clase System.Diagnostics.Process. Tiene, entre otras cosas, un método GetService(), tal vez eso le ayudará. Si eso no funciona, no es el miembro StartInfo que puede contener información útil.

Si no les importa usar PInvoke, se puede obtener el proceso padre del proceso actual. Si se está ejecutando bajo la cuenta NT AUTHORITY \ SYSTEM y su nombre es service.exe , el proceso actual es (muy probablemente) un servicio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top