Come capire se il metodo viene chiamato da Windows Service in .Net (gestito) del codice

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

  •  06-09-2019
  •  | 
  •  

Domanda

Come faccio a sapere se un metodo che sto scrivendo in codice gestito è di essere chiamata da un app interattivo vs un servizio di Windows?

È stato utile?

Soluzione 2

Credo di aver capito questo (almeno questo funziona per le mie esigenze - la vostra situazione potrebbe essere diversa a seconda di ciò che si sta cercando di fare). C'è una proprietà appeso fuori dell'oggetto ambiente chiamato "UserInteractive". Ti dice se o non è in esecuzione in un contesto con accesso al desktop.

Altri suggerimenti

Quale parte di un servizio di Windows è che si desidera conoscere? O quale parte di un app interattivo non vuoi essere informato? Ciò che conta davvero a voi?


Ogni volta che sento una richiesta del genere, è quasi sempre un errore nel design. Vorrei suggerire una qualche risposta:

  1. Lasciate che il chiamante dirvi che formattatore da utilizzare o
  2. Inserire il nome della classe formattatore in un file di configurazione. Hanno tutti i formattatori implementano la stessa interfaccia. In fase di esecuzione, la prima volta che è necessario un formattatore, creare un'istanza di quello specificato nel file di configurazione, e lo chiamano attraverso l'interfaccia comune.
  3. Non reinventare la ruota. Utilizzare le classi in System.Diagnostics, che, di fatto, configura un po 'come il mio # 2.

E 'quasi sempre un errore per il codice di essere sensibile al contesto è stato chiamato in.

Ci sono almeno 2 modi per farlo:

  1. "System.Reflection.Assembly.GetCallingAssembly (). FullName" restituirà il nome del gruppo che sta chiamando il codice.
  2. "Environment.StackTrace" restituirà l'analisi dello stack completo per chi sta chiamando il codice. Si dovrebbe vedere il nome del metodo di chiamata nella stringa.

È possibile definire due diversi logger: uno per le applicazioni interattive e una per il servizio di Windows. e lasciate cliente scegliere quale logger vuole usare utilizzando un file di configurazione. Si può anche avere un registratore di default se i clienti sceglie un registratore di sbagliato o dimentica da configurare. Penso che dovrebbe essere una migliore idea di avere funzionalità come la registrazione e il messaggio di formattazione per essere configurabile.

Non so se v'è la possibilità incorporato, ma hanno uno sguardo alla classe di System.Diagnostics.Process. E ', tra le altre cose, un metodo GetService(), forse che vi aiuterà. Se non funziona, non v'è il membro StartInfo che può contenere informazioni utili.

Se non ti dispiace utilizzando PInvoke, è possibile ottenere il processo padre del processo corrente. Se è in esecuzione con l'account NT AUTHORITY \ SYSTEM e il suo nome è service.exe , l'attuale processo è (molto probabilmente) un servizio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top