Quando criamos Windows Services sob a plataforma .NET, podemos sobrescrever o método OnCustomCommand fornecido pela classe ServiceBase para que, via ServiceController (classe que permite a interceptação da execução do serviço), possamos disparar esse método customizado e, conseqüentemente, executarmos uma determinada tarefa dentro do mesmo.
protected override void OnCustomCommand(int command) { …. }
Com isso, podemos simplesmente em uma aplicação cliente, instanciarmos a classe ServiceController, especificarmos o serviço e a máquina onde ele reside e, finalmente, invocar o método ExecuteCommand, algo como é mostrado no exemplo abaixo:
new ServiceController(“MeuServico”, “.”).ExecuteCommand(N);
Onde o parametro N representa o número inteiro que será passado para o método OnCustomCommand. A questão é que temos um detalhe a ser considerado aqui: se esse valor inteiro for menor que 128, uma exceção do tipo Win32Exception com a seguinte mensagem é atirada: Access denied. Isso ocorre porque provavelmente valores menores que 128 são reservados para o próprio sistema operacional.
Se não me engano, nas versões 1.x do .NET Framework, a exceção atirada era algo como “parametro incorreto”, o que me parece mais significativo para o caso.
Só para completar:
em Visual Basic:
[quote]Protected Overrides Sub OnCustomCommand(ByVal command As Integer)
MyBase.OnCustomCommand(command)
Select Case command
Case 150
‘Aqui é chamada a função/sub
Teste()
Case Else
Exit Sub
End Select
End Sub[/quote]
Este exemplo deve ser incluído no Serviço. No client de controle do Serviço deve ser incluído seguinte Código:
[quote]ServiceController1.ExecuteCommand(Fix(150))[/quote]
Desta forma, ao chamar ExecuteCommand (e isso pode estar no evento onclick de um button) ele executa a rotina 150 automaticamente (no exemplo: Teste()).
Att.