2014-01-09 4 views
3

После некоторых изменений в моем проекте Visual Studio начала всегда перекомпилировать все источники, заставив все зависимые проекты также перекомпилировать, значительно замедляя развитие. Почему это?Visual Studio всегда перекомпилирует код, даже если он не изменился

  • Случается только тогда, когда XML documentation file проверяется и есть какой-то файл с Copy always. Если вы измените любой из этих параметров, источники не будут повторно скомпилированы.
  • Случается только при компиляции внутри Visual Studio - при компиляции с использованием MSBuild из командной строки источники не перекомпилируются.
  • Visual Studio 2012 Update 4.
+0

Я использую VS 2013 Update 2, и я вижу такое же нежелательное поведение: проекты перекомпилированы, когда никаких изменений не произошло с исходным кодом. Это происходит, даже если у меня нет файла документации XML, проверенного в любых проектах моего решения. Так что есть и другие причины. :-( – farfareast

+0

Ну, вы можете исследовать его описанным в моем ответе ниже и сообщить о своих выводах. – Jonathan

ответ

1

Это, кажется, ошибка в Visual Studio, когда проект имеет XML documentation file проверил некоторые файлы с Copy always.

Репро:

  1. Создать новый проект - C# библиотеки классов.
  2. Свойства проекта => Build => проверить XML documentation file
  3. Project => Add => New Item => Текстовый файл TextFile1.txt
  4. Изменить TextFile1.txt Copy to Output Directory к Copy always
  5. Щелкните правой кнопкой мыши проект => построить
    • проект составляет
  6. Щелкните правой кнопкой мыши проект => построить

Ожидаемое: Проект не должен быть построен, построить выход должен сказать:

========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ========== 

Актуально: Проект построен, выход:

------ Build started: Project: ClassLibrary1, Configuration: Debug Any CPU ------ 
    ClassLibrary1 -> bin\Debug\ClassLibrary1.dll 
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== 

Intestigation: Перейдя по подробному журналу, вы видите:

Target "CoreCompile" in file "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets" from project "ClassLibrary1.csproj" (target "Compile" depends on it): 
Building target "CoreCompile" completely. 
Output file "bin\Debug\ClassLibrary1.XML" does not exist. 

Глядя в procmon, вы видите, что devenv.exe переименовывает «ClassLibrary1.XML» в «vsA381.tmp» перед запуском MSBuild.exe. Трассировка стека для переименования:

KERNEL32!MoveFileW+0x17 
csproj!CMoveOutOfTheWayScope::EnterScope+0x85 
csproj!CVsProjBuildableProjectCfg::StartBuildProcessWithTarget+0x50b 
csproj!CVsProjBuildableProjectCfg::StartBuildProcess+0xc 
csproj!CVsProjBuildableProjectCfg::StartBuildEx+0x15 
msenv!CSUIBuilder::DoBuild+0x1a3 
msenv!CSUIBuilder::Run+0x66