Visual Studio重建项目在从调试中切换到释放和反之亦然时,选择选项XML文档时

Posted

技术标签:

【中文标题】Visual Studio重建项目在从调试中切换到释放和反之亦然时,选择选项XML文档时【英文标题】:Visual Studio Rebuilds projects when switching from debug to release and vice-versa when option XML documentation is selected 【发布时间】:2019-02-12 18:41:59 【问题描述】:

我遇到的问题与以下问题中描述的非常相似 Visual Studio C# projects force a rebuild when switching from debug to release and vice-versa.

我有两个 C# 项目,一个有对另一个的项目引用。 如果我在 Debug 中构建 (F6) 而在 Release 中构建 (F6)。如果我现在切换回调试并构建 (F6),它应该是最新的。

实际上是这样的。所以我可以看到 bin/Debug 文件夹中的文件日期和程序集版本没有改变。

但是,如果我打开项目的 XML 文档文件,该文件在项目属性/构建/输出下对两个配置(调试和发布)都有项目引用,那么每次我从调试切换到发布时,项目都会重新构建反之亦然。

重现问题:

    点击File/New Project... 创建一个新的Visual C# --> Console Application。保持生成的代码不变。 在解决方案资源管理器中右键单击新解决方案并选择Add -> New Project... 选择Visual C# --> Class Library。保持生成的代码不变。 在解决方案资源管理器中右键单击ConsoleApplication1 并选择Add Reference... 选中SolutionClassLibrary1 旁边的框 -> Projects 并点击OK。 为两种配置(DebugRelease)在项目 Properties / Build / Output 下为 ConsoleApplication1 打开 XML documentation fileDebug 配置中构建项目。它按预期构建。 切换到Release 配置并再次构建。它按预期构建。 切换回Debug 并重新构建。它构建,它不应该。已经建好了是吧?我们所做的只是更改目标配置选择。

我得到以下构建输出:

1>------ Build started: Project: ConsoleApplication1, Configuration: Debug Any CPU ------
1>Build started 07.09.2018 13:46:43.
1>GenerateTargetFrameworkMonikerAttribute:
1>Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
1>CoreCompile:
1>  C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /platform:anycpu32bitpreferred /errorreport:prompt /warn:4 /doc:bin\Debug\ConsoleApplication1.XML /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva+ /reference:H:\CSharp\TestRebuild\ClassLibrary1\bin\Debug\ClassLibrary1.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Microsoft.CSharp.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Core.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.DataSetExtensions.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Xml.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Xml.Linq.dll" /debug+ /debug:full /filealign:512 /optimize- /out:obj\Debug\ConsoleApplication1.exe /subsystemversion:6.00 /target:exe /utf8output Program.cs Properties\AssemblyInfo.cs "C:\Users\WO\AppData\Local\Temp\.NETFramework,Version=v4.5.AssemblyAttributes.cs" obj\Debug\\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs obj\Debug\\TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs obj\Debug\\TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
1>_CopyAppConfigFile:
1>Skipping target "_CopyAppConfigFile" because all output files are up-to-date with respect to the input files.
1>CopyFilesToOutputDirectory:
1>  Copying file from "obj\Debug\ConsoleApplication1.exe" to "bin\Debug\ConsoleApplication1.exe".
1>  ConsoleApplication1 -> H:\CSharp\TestRebuild\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.41
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

如果 XML documentation file 被关闭,我将得到以下构建输出(它应该跳过 CoreCompile):

1>------ Build started: Project: ConsoleApplication1, Configuration: Debug Any CPU ------
1>Build started 07.09.2018 13:50:17.
1>GenerateTargetFrameworkMonikerAttribute:
1>Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
1>CoreCompile:
1>Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
1>_CopyAppConfigFile:
1>Skipping target "_CopyAppConfigFile" because all output files are up-to-date with respect to the input files.
1>CopyFilesToOutputDirectory:
1>  ConsoleApplication1 -> H:\CSharp\TestRebuild\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.07
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

这是一个错误吗?有解决办法吗?

【问题讨论】:

【参考方案1】:

Visual Studio重建项目在从调试中切换到释放和反之亦然时选择选项XML文档

是的,这是 Visual Studio 2013 和 Visual Studio 2015 的known issue。除了额外的 0.00001 秒执行时间外,它不会影响我们的构建结果。

并且此问题已在 Visual Studio 2017 版本 15.6 中修复。我已经在 Visual Studio 2017 15.8.2 (Current) 的最新版本上对其进行了测试,它按预期工作。

您可以在文件Microsoft.Common.CurrentVersion.targets中的目标CopyFilesToOutputDirectory中找到UseSymboliclinksIfPossible="$(CreateSymbolicLinksForCopyFilesToOutputDirectoryIfPossible)"被添加到复制任务中:

<Copy
    SourceFiles="@(IntermediateAssembly)"
    DestinationFolder="$(OutDir)"
    SkipUnchangedFiles="$(SkipCopyUnchangedFiles)"
    OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
    Retries="$(CopyRetryCount)"
    RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
    UseHardlinksIfPossible="$(CreateHardLinksForCopyFilesToOutputDirectoryIfPossible)"
    UseSymboliclinksIfPossible="$(CreateSymbolicLinksForCopyFilesToOutputDirectoryIfPossible)"
    Condition="'$(CopyBuildOutputToOutputDirectory)' == 'true' and '$(SkipCopyBuildProduct)' != 'true'"
        >

  <Output TaskParameter="DestinationFiles" ItemName="MainAssembly"/>
  <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>

</Copy>

如果此错误影响您的工作,您可以将您的 Visual Studio 更新到 2017。

希望这会有所帮助。

【讨论】:

我已经使用 Visual Studio 2017 15.7.6 和 15.8.2 对其进行了测试,并且不再需要重新构建。 使用 Visual Studio 2019 版本 16.7.5,我再次进行了那些不必要的重建。

以上是关于Visual Studio重建项目在从调试中切换到释放和反之亦然时,选择选项XML文档时的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 重建未修改的项目

如果 Visual Studio 项目的设置取决于更改的环境变量,则不会自动重建 Visual Studio 项目

Visual Studio 2003 没有重建,我可以只建一个 dll 并将其传输到服务器吗?

Visual Studio 2012 Vb.net 无法将配置切换到发布模式

Visual Studio 没有为此文档加载任何符号

Visual Studio项目总是重建,但未更新pdb