Come capire se il metodo viene chiamato da Windows Service in .Net (gestito) del codice
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?
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:
- Lasciate che il chiamante dirvi che formattatore da utilizzare o
- 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.
- 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:
- "System.Reflection.Assembly.GetCallingAssembly (). FullName" restituirà il nome del gruppo che sta chiamando il codice.
- "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.