Visual studio 2010 选择“时进行多次重建”;调试“启动新实例”;

Visual studio 2010 选择“时进行多次重建”;调试“启动新实例”;,visual-studio-2010,msbuild,Visual Studio 2010,Msbuild,我有一个大型的VisualStudio2010解决方案(~110个C#项目)。一个项目(我们称之为“A”)是一个控制台应用程序,它对其他项目和一些第三方程序集有大约6个依赖项 如果我构建项目“A”,它会按照预期构建依赖项 如果我右键单击项目“A”并选择Debug | Start new instance,它首先构建项目,然后继续构建大量其他项目。观察“输出”窗口,就好像它一直在重新启动这些其他项目及其依赖项的构建过程 问题在于,原始项目“A”在启动调试器之前不依赖于Visual Studio正在

我有一个大型的VisualStudio2010解决方案(~110个C#项目)。一个项目(我们称之为“A”)是一个控制台应用程序,它对其他项目和一些第三方程序集有大约6个依赖项

如果我构建项目“A”,它会按照预期构建依赖项

如果我右键单击项目“A”并选择Debug | Start new instance,它首先构建项目,然后继续构建大量其他项目。观察“输出”窗口,就好像它一直在重新启动这些其他项目及其依赖项的构建过程

问题在于,原始项目“A”在启动调试器之前不依赖于Visual Studio正在生成的这些其他项目(直接或间接)

这意味着启动调试器需要很长时间

我在其他一些项目中自定义了.csproj文件,但没有自定义“A”项目

通过msbuild生成的命令行都正常运行


什么会导致Visual Studio执行此操作?

这是由于MSBuild的引用链引起的。项目A依赖于项目B,项目B依赖于项目C,依此类推

您有两种选择:

  • 默认情况下,当前解决方案中的新引用标记为
    Copy Local=true
    。这个过程是构建过程中最耗时的过程之一。有时,只有最顶层的项目(.exe文件)具有“复制本地”属性是有意义的,因为lib项目无论如何都不会从它们自己的输出文件夹中运行

  • 在解决方案
    属性
    ->
    配置属性
    -默认情况下,每个项目都标记为生成。您可以从生成中取消选中不相关的项目。此设置将保存在.sln文件中,因此请确保您没有签入此修改-这可能会使您的CI生成失败

  • 编辑:

    • 要进一步分析生成过程,请增加MSBuild详细程度:
      工具
      选项
      项目和解决方案
      生成并运行
      MSBuild项目生成输出详细程度
      并设置为
      详细
      诊断
      。这将帮助您跟踪构建输出的细微差别

    我了解您提到的参考链。这在我进行常规构建时是有意义的——它按照预期构建依赖项目。我不希望在执行调试实例时,它会重建不相关的项目。为什么调试与常规生成时引用链会不同?请参阅更新以了解如何分析生成输出。基本上,VS有一个内置的机制来检测变化。此功能提供了称为“增量构建”的概念。是的,一个好建议。此构建场景的一个问题是,每次重新启动其他项目的构建过程时,它也会清除输出窗口。因此,您只会获得上一个构建依赖项的构建输出——所有之前的构建输出都将丢失。要明确的是,在执行单个“调试启动新实例”之后,这些多个生成过程都会依次发生,您可以通过从命令行运行
    devenv-your.sln/build-Debug/out-vside.log
    来持久化IDE输出。这只是一个命令行构建—与从内部构建解决方案的过程相同,而我描述的场景仅在您右键单击解决方案中的项目并选择“调试启动新实例”时发生。您找到解决此问题的方法了吗?我有完全相同的问题,我已经浪费了一天的时间试图解决这个问题?不是完全解决。我似乎通过从头开始重新创建一些项目(并重新添加项目引用)解决了这个问题。我这样做的理论是,.sln文件中的一些元数据可能被弄乱了。