1

目前正在开发作为 Windows 服务运行的 WCF 服务。

我制作了一个安装程序并编写了一个小脚本,该脚本添加了一个用户帐户以供其运行,然后在该帐户下注册并启动服务。并且在 Visual Studio 中的构建步骤将其复制到一个离散的文件夹中,这样我们就不会直接从解决方案中运行。一切正常。

然而,随着我扩展和改进这项服务,测试它变得有点痛苦。每次我想检查我的更改时,我都必须停止服务、重建、重新启动服务并将 Visual Studio 重新附加到流程中,然后才能逐步完成。

只是想知道是否有更快或更好的方法来执行此操作而无需为所有服务编写一些代理主机?在这种情况下,单元测试不会削减它,因为服务需要做一些系统性的事情,比如连接到 Active Directory 端点。

4

1 回答 1

0

我知道这个问题很古老,但我最近使用构建事件解决了部分问题,如下所示:

预建事件:

if "$(ConfigurationName)" neq "Debug" goto NoStop

echo Attempting to stop windows service MyService
net stop MyService > MyService.log
if "%errorlevel%" neq "0" (call )
type MyService.log

:NoStop

构建后事件:

if "$(ConfigurationName)" neq "Debug" goto NoStart

findstr "/c:stopped successfully" MyService.log >nul
if "%errorlevel%" equ "0" net start MyService
(call )

:NoStart

这种方法的特点:

  • 检查配置,如果我没有在 Debug 中构建,则跳过整个位。
  • NET STOP 命令将尝试停止您的服务,并且它下面的 if 命令将吞下任何可能发生的错误。如果您的服务未安装或未运行,这很好。
  • 由于服务已停止,服务 EXE 已解锁,并且构建不会因那些烦人的“文件已锁定”错误而失败。
  • 只有在构建前事件成功关闭服务时,构建后事件才会启动服务。FINDSTR 命令在预构建事件期间创建的日志文件中搜索字符串“已成功停止”。如果找到,则调用 NET START。无论哪种方式,错误都会被下一行的 (call ) 吞没。

这在 Windows 7 上运行的 Visual Studio 2015 中为我工作。希望这对某人有所帮助!

于 2016-05-11T16:22:15.613 回答