Como saber se método é chamado de Serviço do Windows em .net código (gerenciado)

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

  •  06-09-2019
  •  | 
  •  

Pergunta

Como posso dizer se um método que eu estou escrevendo em código gerenciado está sendo chamada de um aplicativo interativo vs um serviço do Windows?

Foi útil?

Solução 2

Eu acho que pode ter percebido isso (pelo menos isso funciona para minhas necessidades - sua milhagem pode variar, dependendo do que você está tentando fazer). Há uma propriedade que pendura fora do objeto Meio Ambiente chamado "UserInteractive". Diz-lhe se ou não você estiver executando em um contexto com acesso ao ambiente de trabalho.

Outras dicas

Que parte de um serviço do Windows que é que você quer saber? Ou que parte de um aplicativo interativo que você não quer saber? O que realmente importa para você?


Toda vez que eu ouço um pedido como este, é quase sempre um erro no projeto. Gostaria de sugerir algumas respostas:

  1. Deixe o interlocutor dizer-lhe que formatador para uso, ou
  2. Coloque o nome da classe formatador em um arquivo de configuração. Ter todos os formatadores de implementar a mesma interface. Durante a execução, pela primeira vez, você precisa de um formatador, crie uma instância do especificado no arquivo de configuração, e chamá-lo através da interface comum.
  3. Não reinventar a roda. Use as classes System.Diagnostics, que, de fato, configure muito parecido com o meu # 2.

É quase sempre um erro de código para ser sensível ao contexto, foi chamado.

Há pelo menos 2 maneiras de fazer isso:

  1. "System.Reflection.Assembly.GetCallingAssembly (). FullName" irá retornar o nome do assembly que está chamando o seu código.
  2. "Environment.StackTrace" retornará o rastreamento de pilha completo para quem está chamando o seu código. Você deverá ver o seu nome de método chamar na seqüência.

Você pode definir dois logger diferentes: um para aplicativos interativos e um para serviço do Windows. e deixar o cliente escolher qual logger ele quer usar usando um arquivo de configuração. Você também pode ter um logger padrão se os clientes escolhe um logger errado ou esquece de configure. Eu acho que deveria ser uma idéia melhor para ter a funcionalidade como logging e formatação de mensagem para ser configurável.

Não sei se há uma possibilidade embutido, mas ter um olhar para a classe System.Diagnostics.Process. Tem, entre outras coisas, um método GetService(), talvez isso irá ajudá-lo. Se isso falhar, há o membro StartInfo que pode conter informações úteis.

Se você não se importa com PInvoke, você pode começar o processo pai do processo atual. Se ele está sendo executado sob a conta NT AUTHORITY \ SYSTEM e é nome é service.exe , o processo atual é (muito provavelmente) um serviço.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top