安装时启动Windows服务而不安装项目

时间:2014-11-25 14:10:22

标签: c# visual-studio-2012 windows-services setup-project autostart

我开发了一个Windows服务,但是需要它在安装时自动启动。问题是我找到的每个教程都通过Setup Project向我展示。有一个很棒的3部分教程HERE,我曾经将我的应用程序转换为服务,但我的其他项目类型中没有Setup Project。我可以以编程方式执行此操作,还是可以通过某种方式获取Setup Project项目类型?

4 个答案:

答案 0 :(得分:1)

我相信Topshelf项目有内置服务Installer / Uninstaller。当集成到应用程序中时,它可以通过应用程序本身的简单命令作为服务安装,例如,我们可以使用myService.exe命令轻松安装和启动myService.exe install start

我们可以简单地创建一个自安装服务,这里是一个示例:

    public class ServiceClass
    {
        public ServiceClass()
        {
        }
        public void Start() {  }
        public void Stop() {  }
    }

public class Program
{
     public static void Main(string[] args)
     {
        //we can simply install our service by setting specific commands for same or install it directly from command line or from another process
        if (args.Length == 0)
        {
            var processName = Process.GetCurrentProcess().ProcessName + ".exe";
            var install = Process.Start(processName, "install start");
            install.WaitForExit();
            return;
        }

        HostFactory.Run(x =>          
        {
            x.Service<ServiceClass>(s =>            
            {
                s.ConstructUsing(name => new ServiceClass()); 
                s.WhenStarted(tc => tc.Start());        
                s.WhenStopped(tc => tc.Stop());         
            });
            x.RunAsLocalSystem();                     

            x.SetDescription("Topshelf Host");       
            x.SetDisplayName("TopShelf");               
            x.SetServiceName("TopShelf");                 
        });                                       
    }
}

你可以通过PM> Install-Package Topshelf Nuget命令获得Topshelf。

答案 1 :(得分:1)

在Installer类中,为AfterInstall事件添加处理程序。然后,您可以在事件处理程序中调用ServiceController来启动服务。

public ServiceInstaller()
{
    //... Installer code here
    this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
    {
         sc.Start();
    }
}

现在,当您在安装程序上运行InstallUtil时,它将安装然后启动该服务。

MSDN link for more details

答案 2 :(得分:0)

如果您的目标是Windows 7及更高版本,默认情况下会安装Powershell。一种选择是运行一个简单的PowerShell脚本,它安装服务,启动它,并将服务设置为在重新启动机器时自动启动:

InstallUtil yourService.exe
Start-Service yourService
Set-Service yourService -startuptype "Automatic"

答案 3 :(得分:0)

最好的办法是添加安装程序项目扩展!

在VS 2010之后,不推荐使用安装项目类型,但是根据反馈,微软已经为VS 2013带来了新版本。

从Microsoft安装新的安装程序项目扩展:https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d

这适用于任何非Express版本的Visual Studio 2013(包括新的免费Community Edition SDK)

然后,您可以按照与VS 2010安装项目相同的说明进行操作:)

对于VS2012来说没有一个简单的选择(我猜你可以尝试使用WiX的安装程序,但这需要学习很多东西!) 我不确定InstallShield LE(VS2012的免费版)是否适用于这种情况,但你可以尝试一下。

您可以随时更改安装后的服务启动类型。 (控制面板 - &gt;管理工具 - &gt;服务 - &gt;右键单击服务 - &gt;属性 - &gt;将“启动类型”更改为“自动”)