Instale o Windows Service criado no Visual Studio

136

Quando crio um novo serviço do Windows no Visual Studio 2010, recebo a mensagem informando o uso do InstallUtil e net start para executar o serviço.

Eu tentei as seguintes etapas:

  1. Criar novo projeto Arquivo -> Novo -> Projeto -> Serviço do Windows
  2. Nome do Projeto: TestService
  3. Crie o projeto como está (construtor Service1, OnStart, OnStop)
  4. Abra o prompt de comando, execute "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe" TestService.exe
  5. Execute net start TestService .

Saída da etapa 4

Executando uma instalação transacionada.

Iniciando a fase de instalação da instalação.

Consulte o conteúdo do arquivo de log para obter o progresso do assembly C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

O arquivo está localizado em C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Instalando o assembly 'C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

Os parâmetros afetados são:

logtoconsole =

arquivo de log = C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ TestService \ Est estervervice \ obj \ x86 \ Debug \ TestService.InstallLog

assemblypath = C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

Não foi possível encontrar nenhum instalador público com o atributo RunInstallerAttribute.Yes no assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

A fase de instalação foi concluída com êxito e a fase de confirmação está começando.

Consulte o conteúdo do arquivo de log para obter o progresso do assembly C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

O arquivo está localizado em C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Confirmando o assembly 'C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

Os parâmetros afetados são:

logtoconsole =

arquivo de log = C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ TestService \ Est estervervice \ obj \ x86 \ Debug \ TestService.InstallLog

assemblypath = C: \ Usuários \ nome de usuário \ Documentos \ Visual Studio 2010 \ Projetos \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

Não foi possível encontrar nenhum instalador público com o atributo RunInstallerAttribute.Yes no assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Remova o arquivo InstallState porque não há instaladores.

A fase de confirmação foi concluída com êxito.

A instalação transacionada foi concluída.

Saída da etapa 5

O nome do serviço é inválido.

Mais ajuda está disponível, digitando NET HELPMSG 2185.

jkh
fonte

Respostas:

243

Você precisa abrir o arquivo Service.cs no designer, clicar com o botão direito do mouse e escolher a opção de menu "Adicionar instalador".

Ele não é instalado imediatamente, você precisa criar a classe do instalador primeiro.

Algumas referências no instalador do serviço:

Como adicionar instaladores ao seu aplicativo de serviço

Muito velho ... mas é sobre isso que estou falando:

Serviços do Windows em c #: adicionando o instalador (parte 3)

Ao fazer isso, a ProjectInstaller.csserá criado automaticamente. Em seguida, clique duas vezes nele, entre no designer e configure os componentes:

  • serviceInstaller1tem as propriedades do próprio serviço: Description, DisplayName, ServiceNamee StartTypesão os mais importantes.

  • serviceProcessInstaller1tem essa propriedade importante: Accounté a conta na qual o serviço será executado.

Por exemplo:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
Miguel Angelo
fonte
3
Adicionando o instalador e configurando a conta ao LocalSystem, foi possível. Obrigado!
Luc
1
Estou recebendo o mesmo erro no VS2013. Verifiquei os links que você forneceu, verifiquei que tenho o ProjectInstaller, incluindo o serviço [Process] Installer1 dos componentes, configurado corretamente. Eu executo o installutil.exe como administrador. Ele ainda informa "Não foi possível encontrar nenhum instalador público com o atributo RunInstallerAttribute.Yes". Alguma ideia?
Barry Dysert
4
Ri muito. Eu amo que o link "Muito antigo" seja para um site chamado Arcane Code. Quanto mais velho que a página fica, mais verdadeiro nome se torna :-)
HotN
O que é "o designer"? Aplicativos que não possuem interface do usuário geralmente não envolvem nada que seria chamado de designer.
Maxx
Os serviços também têm um designer, assim como formas
Grungondola
11

Olhando para:

Não foi possível encontrar nenhum instalador público com o atributo RunInstallerAttribute.Yes no assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Parece que você pode não ter uma classe de instalador no seu código. Esta é uma classe que herda Installerque dirá installutilcomo instalar seu executável como um serviço.

Ps Eu tenho meu próprio debuggable modelo pouco de auto-instalação / serviço Windows aqui, que você pode copiar o código a partir de ou uso: debuggable, auto-instalação Windows Service

James Michael Hare
fonte
Quando clico com o botão direito do mouse no projeto TestService no Visual Studio -> Propriedades -> Serviços, a página está desativada ... você estava se referindo a um local diferente? Em aplicativo, o nome do assembly é TestService.
jkh
@ John: Ignore a primeira parte sobre o console de serviços, veja a segunda parte começando com Actually . Parece que o serviço nunca foi instalado porque não encontrou um instalador.
James Michael Hare
8

Aqui está uma maneira alternativa de criar o instalador e se livrar dessa mensagem de erro. Também parece que o VS2015 express não possui o item de menu "Adicionar instalador".

Você só precisa criar uma classe e adicionar o código abaixo e a referência System.Configuration.Install.dll.

using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;


namespace SAS
{
    [RunInstaller(true)]
    public class MyProjectInstaller : Installer
    {
        private ServiceInstaller serviceInstaller1;
        private ServiceProcessInstaller processInstaller;

        public MyProjectInstaller()
        {
            // Instantiate installer for process and service.
            processInstaller = new ServiceProcessInstaller();
            serviceInstaller1 = new ServiceInstaller();

            // The service runs under the system account.
            processInstaller.Account = ServiceAccount.LocalSystem;

            // The service is started manually.
            serviceInstaller1.StartType = ServiceStartMode.Manual;

            // ServiceName must equal those on ServiceBase derived classes.
            serviceInstaller1.ServiceName = "SAS Service";

            // Add installer to collection. Order is not important if more than one service.
            Installers.Add(serviceInstaller1);
            Installers.Add(processInstaller);
        }
    }
}
Carol
fonte
A execução do VS2015 também e essa solução me levaram além da mensagem de erro "Nenhum instalador público com o RunInstallerAttribute.Yes" que eu estava recebendo anteriormente. Obrigado!
precisa saber é o seguinte
6

Dois problemas típicos:

  1. Falta a classe ProjectInstaller (como @MiguelAngelo apontou)
  2. O prompt de comando deve "Executar como administrador "
fabriciorissetto
fonte
4

Outro possível problema (que eu encontrei):

Certifique-se de que a ProjectInstallerclasse seja public. Para ser sincero, não tenho certeza de como exatamente fiz isso, mas adicionei manipuladores de eventos a ProjectInstaller.Designer.cs, como:

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

Eu acho que durante o processo automático de criação da função manipuladora ProjectInstaller.csmudou a definição de classe de

public class ProjectInstaller : System.Configuration.Install.Installer

para

partial class ProjectInstaller : System.Configuration.Install.Installer

substituindo a publicpalavra-chave por partial. Então, para corrigi-lo, deve ser

public partial class ProjectInstaller : System.Configuration.Install.Installer

Eu uso o Visual Studio 2013 Community edition.

John Archer
fonte
Eu sei que isso é três anos depois, mas isso resolveu meu problema. Não sei por que ou quando o designer alterou a classe parcial pública anterior para classe parcial interna. Obrigado!
precisa saber é o seguinte
2

Alteração furtiva no VS 2010 e .NET 4.0 e posterior

Não foi possível encontrar nenhum instalador público com o atributo RunInstallerAttribute.Yes

Há uma alteração de alias ou limpeza do compilador no .NET que pode revelar esse pequeno ajuste para o seu caso específico.

Se você tem o seguinte código…

RunInstaller(true)   // old alias  

Pode ser necessário atualizá-lo para

RunInstallerAttribute(true)  // new property spelling

É como um alias alterado nos bastidores em tempo de compilação ou em tempo de execução e você receberá esse comportamento de erro. A alteração explícita acima para RunInstallerAttribute (true) corrigiu-a em todos os nossos cenários de instalação em todas as máquinas.

Depois de adicionar o instalador do projeto ou serviço, verifique o RunInstaller "true" (true) e altere-o para o novo RunInstallerAttribute (true)

Sql Surfer
fonte
De acordo com meu conhecimento, você pode omitir o postfix "Attribute", ou seja, [RunInstaller (true)] e [RunInstallerAttribute (true)] são os mesmos. Experimente com um atributo diferente, por exemplo, [DebuggerStepThrough ()] e [DebuggerStepThroughAttribute ()] - ambos funcionarão quando aplicados a uma classe.
Matt
1

Outro problema que encontrei: verifique se a classe derivada do Installer (normalmente ProjectInstaller) está no topo da hierarquia do namespace, tentei usar uma classe pública dentro de outra classe pública, mas isso resultou no mesmo erro antigo:

Não foi possível encontrar nenhum instalador público com o atributo RunInstallerAttribute.Yes


fonte