事件生成前后如何停止和重新启动Windows服务。

18

我一直在尝试使用构建事件来启动和停止在我的项目中正在构建的Windows服务。但是,预构建和后构建都会因为错误级别255而失败。我已经尝试在预构建时捕获它,但没有成功。

预构建

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
)
4个回答

23

4
我更喜欢在构建后将“停止、复制、启动、退出”全部放置在一个位置,因为服务路径可能不应该直接指向/bin/Release文件夹。这还可以防止由于其他原因而构建失败时,服务被停止但从未重新启动。 - Dan Bechard
2
@Dan 给出了正确的答案。这也让您可以轻松地在不重新安装/重定向服务的情况下切换到不同的构建配置、分支等。从 SDM 链接的评论中,您还可以自动安装服务,以便新开发人员可以直接使用。 - Nelson Rothermel

1

尝试在预构建代码的第一行使用开括号


1
条件语句不需要双引号("")。
应该像这样。
if $(ConfigurationName) == Debug (
 net stop myService
 ...
)

我相信在变量为空的情况下,始终使用引号是一种常见做法,否则你可能会得到 if == Debug 而不是 if "" == "Debug"。然而,在这种情况下,$(ConfigurationName) 应该始终有一个值。 - Nelson Rothermel
不确定。当我在Visual Studio中添加“”时,它对我没有起作用。 - Andrew Chaa
你说得有可能是对的。我在批处理文件中见过这种做法,并且认为那就是原因。但我在网上进行了快速搜索,没有找到确切的答案。 - Nelson Rothermel

0
这是我让它工作的方法:
(此解决方案是企业软件的一部分,其中一些dll文件被另一个应用程序重用)
Model是一个项目,被Service项目引用,并在Service之前构建。这就是为什么我们在Model的Pre-Build事件中编写这些代码的原因:

模型预构建事件:

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
  • 在输出文件夹中创建一个目录
  • 通过名称查找服务
  • 停止它
  • 卸载它
  • 如果在此处发生错误,exit 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会自动请求提升权限

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接