2011-03-14 77 views
15

我一直在尝试使用生成事件来启动和停止正在建在我的项目的Windows服务。然而对于前期&后构建失败,错误级别255我试着捕捉这种预建,没有运气。事件预生成和后期停止和重新启动Windows服务

预建

if "$(ConfigurationName)" == "Debug" 
(
net stop myService 
if errorlevel 2 
    if errorlevel 255 
     :exit 

    :exit 
) 

生成后

if "$(ConfigurationName)" == "Release" 
(
    copy $(TargetDir) C:\Media\Bin\$(ProjectName) 
    if errorlevel 1 BuildEventFailed 

    :BuildEventFailed 
    mkdir C:\Media\Bin\$(ProjectName) 

    copy $(TargetDir) C:\Media\Bin\$(ProjectName) 
) 
else if "$(ConfigurationName)" == "Debug" 
(
    net start myService 
) 

回答

1

尝试使用第一线的预生成代码

21

乔尔Varty以下博客具有开放parenthese一个解决方案,我用: Use Build Events to rebuild a Windows Service without having to manually stop/start it

唯一的问题是当你重建。 Visual Studio在预生成事件触发前清理文件。由于服务仍在运行,因此这一过程失败。但定期建设工作很好。希望这可以帮助。

+3

我喜欢有'停止,复制,启动exit'都在生成后,因为服务路径或许不应该直接指向/ bin/Release文件夹。这还可以防止服务被停止,但如果由于其他原因而导致构建失败,则从不重新启动。 – Dan 2013-02-13 18:46:45

+2

@丹有正确的答案。这也可以让你轻松地切换到不同的生成配置,分支等,无需重新安装/重新指定服务。从SDM链接的评论中,您也可以自动安装该服务,以便新开发人员能够正常工作。 – 2014-04-07 17:50:08

1

条件语句不需要双qoute( “”)

应该是这样

if $(ConfigurationName) == Debug (
net stop myService 
... 
) 
+0

我认为在变量为空的情况下总是使用引号是很常见的做法,否则最终可能会出现'if == Debug'而不是'if“== == Debug”'。但是,在这种情况下'$(ConfigurationName)'*应该*总是有一个值。 – 2014-04-07 17:51:50

+0

不确定。当我添加“”时,它在视觉工作室上不起作用 – Andy 2014-04-08 14:42:17

+0

你可能是对的。我已经多次在批处理文件中看到过这种做法,并认为是这种情况。通过在线快速搜索,我没有真正发现任何明确的。 – 2014-04-11 21:14:58

0

这是我如何得到它的工作:

(此解决方案是其中的一些dll文件是由另一个应用程序重复使用)

模型是一个项目,这是裁判的企业软件的一部分在服务项目中出现,它是在服务之前建立的。这就是为什么我们写型号的预生成事件这些代码:


型号预生成事件:

if not exist "$(SolutionDir)UI\bin\Debug\ServiceFolder" mkdir "$(SolutionDir)UI\bin\Debug\ServiceFolder" 

net start | find "[Service Name]" 

if ERRORLEVEL 0 (
net stop "Service Name" 
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" -u "$(SolutionDir)UI\bin\Debug\ServiceFolder\Service.exe" 
) 

exit 0 
  • 创建输出文件夹
  • 在目录中的名称查找服务
  • 停止它
  • 卸载它
  • 退出0将导致生成过程,如果这里出现错误,继续

服务生成后事件:

xcopy /E /Y "$(ProjectDir)bin\Debug\*" "$(SolutionDir)UI\bin\Debug\ServiceFolder" 
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" "$(SolutionDir)UI\bin\Debug\ServiceFolder\Service.exe" 
net start "Service Name" 
  • 所需服务都复制到另一个文件夹
  • 安装服务
  • 启动服务

关于权限?

  • Visual Studio会要求较高的权限自动