MSBuild использует реестр, чтобы получить путь к инструментам v3.5. Задачи MSBuild, для которых требуются инструменты SDK версии 3.5, вернутся к пути версии 4.0, если путь к инструментам версии 3.5 не могут быть идентифицированы - посмотрите на логику, используемую для установки свойства TargetFrameworkSDKToolsDirectory в C: \ Windows \ Microsoft. NET \ Framework \ v4.0.30319 \ Microsoft.NETFramework.props, если вы действительно заинтересованы.
Вы можете диагностировать и устранить эту проблему следующим образом:
Установите Process Monitor и настройте фильтр для мониторинга доступа к реестру с помощью msbuild (Класс события: Registry, Имя процесса: msbuild.exe, все типы результатов).
Запустите сборку.
Монитор процесса поиска для доступа RegQueryValue, совпадающего с "MSBuild \ ToolsVersions \ 4.0 \ SDK35ToolsPath". Обратите внимание, что это может быть либо «HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft», либо «HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft».
Если вы посмотрите на этот ключ в реестре, вы увидите, что он псевдоним другого значения реестра, например, "$ (Реестр: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.1 \ WinSDK-NetFx35Tools-x86 @ InstallationFolder)"
Вскоре после этого вы, вероятно, увидите результат «ИМЯ НЕ НАЙДЕНО». Если вы посмотрите, где должен быть ожидаемый ключ, вы увидите, что он не соответствует запрашиваемому ключу (отсутствуют дефисы и, возможно, нет ключа, заканчивающегося на «-86»).
Должно быть понятно, что нужно исправить. Я решил экспортировать неправильные ключи, отредактировать файл .reg и запустить его, чтобы создать правильные ключи.
Одной из причин неправильных записей реестра может быть ошибка при установке Microsoft SDK v7.1:
http://connect.microsoft.com/VisualStudio/feedback/details/594338/tfs-2010-build-agent-and-windows-7-1-sdk-targeting-net-3-5-generates-wrong-embedded-resources