C# VisualStudio在从调试切换到发布时重建项目,在选择XML文档选项时,反之亦然

C# VisualStudio在从调试切换到发布时重建项目,在选择XML文档选项时,反之亦然,c#,visual-studio,visual-studio-2013,msbuild,rebuild,C#,Visual Studio,Visual Studio 2013,Msbuild,Rebuild,我有一个与下面问题中描述的问题非常相似的问题 我有两个项目,其中一个项目引用了另一个项目。 如果我在调试中生成F6,而不是在发行版中生成F6。如果我现在切换回调试并构建F6,它应该是最新的 事实就是这样。因此,我可以看到在bin/Debug文件夹中,文件日期和程序集版本没有改变 但是,如果我在“调试”和“发布”两种配置的“项目属性/Build/Output”下打开该项目的XML文档文件(该项目引用了另一个项目),则每次从“调试”切换到“发布”,项目都会重新生成,反之亦然 要重新创建问题,请执行

我有一个与下面问题中描述的问题非常相似的问题

我有两个项目,其中一个项目引用了另一个项目。 如果我在调试中生成F6,而不是在发行版中生成F6。如果我现在切换回调试并构建F6,它应该是最新的

事实就是这样。因此,我可以看到在bin/Debug文件夹中,文件日期和程序集版本没有改变

但是,如果我在“调试”和“发布”两种配置的“项目属性/Build/Output”下打开该项目的XML文档文件(该项目引用了另一个项目),则每次从“调试”切换到“发布”,项目都会重新生成,反之亦然

要重新创建问题,请执行以下操作:

单击文件/新建项目。。。 创建新的Visual C->控制台应用程序。让生成的代码保持原样。 右键单击解决方案资源管理器中的新解决方案,然后选择添加->新建项目。。。 选择visualc->classlibrary。让生成的代码保持原样。 在解决方案资源管理器中的ConsoleApplication1上单击鼠标右键,然后选择“添加引用…”。。。 选中解决方案->项目中ClassLibrary1旁边的复选框,然后点击OK。 在调试和发布配置的项目属性/Build/Output下打开ConsoleApplication1的XML文档文件 在调试配置中生成项目。正如预期的那样,它可以构建。 切换到释放配置并重新生成。正如预期的那样,它可以构建。 切换回调试并重新生成。它可以构建,但不应该。它已经建成了,对吗?我们所做的只是更改目标配置选择。 我将获得以下生成输出:

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文档文件,我将获得以下生成输出,它将跳过CoreComile,因为它应该这样做:

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 ==========
这是虫子吗?有解决办法吗

VisualStudio在从调试切换到发布时重建项目,在选择XML文档选项时,反之亦然

是的,这是VisualStudio 2013和VisualStudio 2015的最佳选择。这只是一个微弱的震动,除了额外的0.00001秒执行时间外,它不会影响我们的构建结果

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

您可以在文件Microsoft.Common.CurrentVersion.targets中的目标CopyFilesToOutputDirectory中的复制任务中找到UseSymbolicClinkSifEnable=$CreateSymbolicClinksforCopyFilesToOutputDirectoryIfEnable:

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


希望这有帮助。

我已经用Visual Studio 2017 15.7.6和15.8.2对其进行了测试,不再进行不必要的重建。使用Visual Studio 2019版本16.7.5,我再次进行了不必要的重建。
<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>