Visual Studio 在从调试切换到发布时重新生成项目,反之亦然,当选择了选项 XML 文档时



我有一个与以下问题中描述的问题非常相似的问题 Visual Studio C# 项目在从调试切换到发布时强制重新生成,反之亦然。

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

事实确实如此。所以我可以看到在 bin/Debug 文件夹中的文件日期和程序集版本没有变化。

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

要重现问题,请执行以下操作:

  1. 点击File/New Project...
  2. 创建一个新Visual C#-->Console Application。 将生成的代码保留原样。
  3. 右键单击解决方案资源管理器中的新解决方案,然后选择"Add->New Project...
  4. 选择Visual C#-->Class Library。 将生成的代码保留原样。
  5. 右键单击解决方案资源管理器中的ConsoleApplication1,然后选择"Add Reference...
  6. 选中Solution->ProjectsClassLibrary1旁边的框,然后点击OK.
  7. 打开项目Properties/Build/OutputConsoleApplication1XML documentation file,用于两种配置(DebugRelease(
  8. Debug配置中生成项目。 正如预期的那样,它构建。
  9. 切换到Release配置并重新生成。 正如预期的那样,它构建。
  10. 切换回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)MSBuild12.0binCsc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /platform:anycpu32bitpreferred /errorreport:prompt /warn:4 /doc:binDebugConsoleApplication1.XML /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva+ /reference:H:CSharpTestRebuildClassLibrary1binDebugClassLibrary1.dll /reference:"C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5Microsoft.CSharp.dll" /reference:"C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5mscorlib.dll" /reference:"C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5System.Core.dll" /reference:"C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5System.Data.DataSetExtensions.dll" /reference:"C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5System.Data.dll" /reference:"C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5System.dll" /reference:"C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5System.Xml.dll" /reference:"C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5System.Xml.Linq.dll" /debug+ /debug:full /filealign:512 /optimize- /out:objDebugConsoleApplication1.exe /subsystemversion:6.00 /target:exe /utf8output Program.cs PropertiesAssemblyInfo.cs "C:UsersWOAppDataLocalTemp.NETFramework,Version=v4.5.AssemblyAttributes.cs" objDebug\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs objDebug\TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs objDebug\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 "objDebugConsoleApplication1.exe" to "binDebugConsoleApplication1.exe".
1>  ConsoleApplication1 -> H:CSharpTestRebuildConsoleApplication1binDebugConsoleApplication1.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:CSharpTestRebuildConsoleApplication1binDebugConsoleApplication1.exe
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.07
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

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

Visual Studio 在从调试切换到发布时重新生成项目,反之亦然,当选择了选项 XML 文档时

是的,这是Visual Studio 2013和Visual Studio 2015的已知问题。这只是一个微弱的冲击,除了额外的 0.00001 秒执行时间外,不会影响我们的构建结果。

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

您可以在文件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。

希望这有帮助。

相关内容

最新更新