Visual Studio 2010中预构建步骤中的吞咽错误

时间:2011-04-27 15:17:38

标签: visual-studio visual-studio-2010 prebuild pre-build-event

我的解决方案有一堆项目,其中一个是Windows服务;我有一个预建步骤来停止服务和一个postbuild步骤重新启动它(这样,当VS正在构建/覆盖它时,windows service exe不会被锁定)。

on pre-build: 
net stop myservice

on post-build:
net start myservice

如果在我开始构建时服务没有运行,则net stop命令会失败并阻止构建继续进行。

即使预构建步骤失败,我还能做什么来强制构建?

6 个答案:

答案 0 :(得分:52)

我想通了 - 你只需要在最后添加以下语句:

SET ERRORLEVEL = 0

或简单地说:

EXIT 0

答案 1 :(得分:25)

我知道这是一个老帖子,但我最近也有这个问题。我想杀死我正在构建的进程,如果它当前正在运行,并且发现我可以这样做:

taskkill /f /im $(TargetName).exe 2>nul 1>nul
Exit 0

2>nul 1>nul没有Exit 0,反之亦然,似乎无效。我必须做两件事。

另外值得注意的是这是使用Visual Studio Express 2012。

我在查看此问题时也找到了解决方案on this blog

  

2> nul 1> nul将从命令中吞下stderr和stdout。 EXIT 0将确保构建事件返回0。

答案 2 :(得分:4)

没有必要重新修改stdout,只需要stderr。此外,set errorlevel允许您在以后需要时添加额外的行。退出将立即终止。

taskkill /f /im:$(TargetFileName) 2>nul &set errorlevel=0

在VS 2017中工作。

答案 3 :(得分:0)

net命令包装在批处理文件中并使用exit /B 0

http://ss64.com/nt/exit.html

答案 4 :(得分:0)

有点晚了,但是是一个很好的解决方案,所以我还是分享一下。

以下解决方案来自此blog post

您只需定义您的根据需要发布构建步骤。您不需要将它们包装到批处理文件中,但是可以。然后,更改项目文件(例如vbproj或csproj文件),并在项目结束标记之前插入以下片段:

<Target
  Name="PostBuildEvent"
  Condition="'$(PostBuildEvent)'!=''"
  DependsOnTargets="$(PostBuildEventDependsOn)">
  <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" ContinueOnError="true" />
</Target>

这更改了Visual Studio执行后期构建步骤的方式。 ContinueOnError属性指示VS忽略错误。它仍会在构建结果中发出警告,但不会停止构建。

您可以通过相应地更改上述片段来对PreBuildEvent进行相同的操作。

当然,这仅适用于完整的所有构建步骤。您不能仅在某些步骤上选择性地忽略错误。如果需要这样做,则必须坚持使用批处理文件的解决方案,但是上述解决方案的好处是您不需要单独的批处理。

Sascha

答案 5 :(得分:-2)

将命令嵌入到始终返回0的可执行文件中会解决您的问题吗?

在c电话中

system("net stop myservice")