Msbuild问题

时间:2011-07-21 14:57:00

标签: visual-studio-2008 msbuild

我有几个长期运行的自定义构建任务。它看起来像Visual Studio,但是在UI线程上运行msbuild任务,这导致IDE挂起。

我在google上做了一些搜索,我发现的最好的是一些错误报告,回复“哦,是的,这是一个问题,我们可能会在以后修复它。”

http://connect.microsoft.com/VisualStudio/feedback/details/670873/visual-studio-ui-freezes-during-long-msbuild-task

http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/3289eb7d-7989-4350-8c43-02bf9913edbd/

所以,我决定通过以下方式修复我的自定义任务:

  1. 检测它们何时在Visual Studio中运行。
  2. 在后台线程上运行任务
  3. 向UI线程添加“MsgWaitForMultipleHandles / Custom消息泵”,以便在事情运行时保持UI响应。
  4. 这似乎有效。我现在可以在没有IDE冻结的情况下运行我的构建。

    无论如何,这提出了几个问题:

    1. 这样做安全吗? Visual Studio是一件大事。如果我这样做,我会遇到任何重入问题吗?那些重新引发的问题会导致世界结束,还是我可以忽视它们。

    2. 我使用this post中概述的技术检测Visual Studio。基本上,我将“BuildingInsideVisualStudio”属性的值赋给任务上的属性,我在我的Execute()方法中检查。如果是真的,那么我使用多线程行为,否则我只使用顺序行为。但是,这需要使用任务的每个目标将额外的goo放入msbuild文件中以避免出现问题。理想情况下,我希望“不吸吮”成为正常行为,没有特殊配置。有什么方法可以在我的任务的Execute()方法中检测visual studio吗?我是否可以在任务实现中读取项目属性而无需对XML进行自定义编辑?我可以以某种方式询问Host对象吗?

    3. 感谢。

1 个答案:

答案 0 :(得分:1)

尝试将环境变量MSBuildNoInProcNode设置为1,然后启动IDE。这将强制IDE构建对子节点的请求。请注意,这不是一个经过完全测试的场景,因此可能会出现一些意外行为,但它可能是获得所需结果的替代方法,而无需更改项目文件或所有自定义任务。