Eu tenho um serviço padrão do Windows .NET escrito em C #.
Ele pode se instalar sem usar o InstallUtil? Devo usar a classe do instalador de serviço? Como devo usá-lo?
Quero poder chamar o seguinte:
MyService.exe -install
E terá o mesmo efeito que chamar:
InstallUtil MyService.exe
c#
.net
deployment
windows-services
installutil
Yuval Peled
fonte
fonte
Respostas:
Sim, isso é totalmente possível (ou seja, eu faço exatamente isso); você só precisa fazer referência à dll correta (System.ServiceProcess.dll) e adicionar uma classe de instalador ...
Aqui está um exemplo:
fonte
static void Install(bool undo, string[] args)
definição fora da classe (etc). Você pode esclarecer como implementou isso?Dê uma olhada no método InstallHelper da classe ManagedInstaller . Você pode instalar um serviço usando:
É exatamente isso que o InstallUtil faz. Os argumentos são os mesmos que para o InstallUtil.
Os benefícios desse método são que ele não envolve nenhuma alteração no registro e usa o mesmo mecanismo que o InstallUtil.
fonte
InstallUtil
faz 3. você não precisa alterar o instalador no x86 / x64 4. não foi alterado em várias versões do .Net - se isso acontecer , ele será capturado nos testes e eu o corrigirei.Você sempre pode voltar para as boas chamadas antigas da WinAPI, embora a quantidade de trabalho envolvida não seja trivial. Não é necessário que os serviços .NET sejam instalados por meio de um mecanismo compatível com .NET.
Para instalar:
OpenSCManager
.CreateService
para registrar o serviço.ChangeServiceConfig2
para definir uma descrição.CloseServiceHandle
.Para desinstalar:
OpenSCManager
.OpenService
.DeleteService
o identificador retornado porOpenService
.CloseServiceHandle
.A principal razão pela qual prefiro isso usando o
ServiceInstaller
/ServiceProcessInstaller
é que você pode registrar o serviço com seus próprios argumentos de linha de comando personalizados. Por exemplo, você pode registrá-lo como"MyApp.exe -service"
, se o usuário executar o aplicativo sem argumentos, você poderá oferecer a ele uma interface do usuário para instalar / remover o serviço.A execução do Refletor
ServiceInstaller
pode preencher os detalhes que faltam nesta breve explicação.PS: Claramente, isso não terá "o mesmo efeito que chamar: InstallUtil MyService.exe" - em particular, você não poderá desinstalar usando o InstallUtil. Mas parece que talvez esse não seja um requisito rigoroso para você.
fonte
Aqui está uma classe que eu uso ao escrever serviços. Normalmente, tenho uma tela interativa que aparece quando o serviço não é chamado. A partir daí, uso a classe conforme necessário. Ele permite várias instâncias nomeadas na mesma máquina, portanto, o campo InstanceID
Amostra de chamada
A classe em si
fonte
GetCurrentProcess
peça por um parâmetro e a usei com êxito. funciona bem!Os exemplos acima realmente não funcionaram para mim, e o link para o fórum como uma solução nº 1 é péssimo. Aqui está uma classe que escrevi (em parte), e a outra parte é mesclada a partir deste link que encontrei enterrado em algum lugar
Para instalar um serviço, execute o comando InstallAndStart da seguinte maneira:
Verifique se a conta que está executando o programa tem permissão para instalar serviços. Você sempre pode 'Executar como administrador' no programa.
Também incluí vários comandos para acesso não-API que não instalam ou removem serviços, mas você pode listá-los e controlar vários (iniciar, parar, reiniciar). Você realmente só precisa elevar as permissões para instalar ou remover serviços.
Existem alguns comandos para obter e definir variáveis de ambiente, como
OPENSSL_CONF
ouTEMP
. Na maior parte, os parâmetros e nomes de métodos devem ser bastante auto-explicativos.fonte
Unknown = -1, NotFound = 0, Stopped = 1, StartPending = 2, StopPending = 3, Running = 4
No caso de tentar instalar um aplicativo de linha de comando como um serviço do Windows, tente o utilitário ' NSSM '. Detalhes relacionados ao ServerFault encontrados aqui .
fonte
fonte