我在Visual Studio 2010中使用C#创建了一个Windows服务。我做了很多关于自动化安装过程的研究。有很多建议,但没有一个对我有用。我创建的Windows服务有很多依赖项,我希望客户端在安装过程中没有UI交互。我为此创建了一个安装项目,其中包含安装程序中的所有依赖项。
涉及的流程:
到目前为止我做了什么:
请记住powershell脚本
sc create "servicename" binpath="somepath"
用于从项目目录安装服务,而不是用于安装使用Setup Project创建的.msi文件,这是两个截然不同的东西。如果您不明白,请不要回答。
可能的解决方案:
现在我的问题是。如何将Windows服务安装程序推送到远程位置?如何创建自定义构建参数并使用msbuild扩展包或Exec Task并安装服务?
我知道对于没有使用安装项目创建的(.MSI)安装服务的人来说,这听起来很愚蠢和恼人。但是我的要求是我试图在企业环境中解决几个星期。
答案 0 :(得分:18)
我会从powershell脚本中完成大部分工作。
使用您提到的msbuild Exec任务将其添加到构建过程中。这是关于using the exec task to run your powershell script的一篇非常好的文章。
由于您使用的是VS 2010,setup and deployment project非常简单。在解决方案中添加一个,并将服务项目的输出添加到其中。这是关于adding the setup project for a windows service的文章。
使用您的powershell脚本将安装程序.msi复制到远程服务器。如果您有权访问文件共享,则可以使用copy-item [source] [destination]
。
停止远程计算机上的服务。您可以使用(get-service -ComputerName [destination] -Name [service-name]).Stop()
(来自this question)
使用psexec psexec \\remotecomputer "[msi-destination-path]" /qn
Here's the rest of the command line options for the .msi.
使用(get-service -ComputerName [destination] -Name [service-name]).Start()
我还会在powershell脚本中为目标服务器,服务名称等添加一堆参数。这将使维护构建过程的这一部分变得更加容易。您的构建代理也很可能也必须是目标计算机上的管理员。
最后,请务必将您的powershell构建脚本放在源代码管理中!
编辑(2014年6月)
VS 2013 has installer projects again!(对不起,VS 2012)
此外,如果找到this awesome answer有关如何在不使用安装项目的情况下安装Windows服务的话。