Ошибка Microsoft.Build.Engine (цели по умолчанию): Target GetFrameworkPaths: не удалось найти.NET Framework SDK
Я пишу веб-сервис, который при вызове должен создать проект C#. Я использую ссылку Framework 2, Microsoft.Buld.Engine и Microsoft.Build.Framework. Если вы посмотрите в файле.csproj раздела
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
который я затем изменил на:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
Мой код для сборки csproj:
Engine buildEngine = new Engine(Path.Combine(Environment.GetEnvironmentVariable("SystemRoot"), @"Microsoft.NET\Framework\v2.0.50727"));
FileLogger logger = new FileLogger();
logger.Parameters = @"logfile=c:\temp\build.log";
buildEngine.RegisterLogger(logger);
bool success = buildEngine.BuildProjectFile([Path_Of_Directory]+ "ProjectName.csproj");
buildEngine.UnregisterAllLoggers();
Переменная успеха возвращает false, потому что сборка не удалась. Затем я проверяю файл build.log, и это ошибка, которую я получаю:
Сборка началась 17.03.2010 11:16:56 Проект "[Path_Of_Directory]\ProjectName.csproj" (цели по умолчанию): Target GetFrameworkPaths: Не удалось найти.NET Framework SDK. Задача ищет путь к.NET Framework SDK в расположении, указанном в значении SDKInstallRootv2.0 раздела реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework. Вы можете решить проблему, выполнив одно из следующих действий: 1.) Установите.NET Framework SDK. 2.) Вручную установите указанный выше раздел реестра в правильное место. цель
Я не могу понять, почему он не будет строить. Любая помощь будет высоко ценится. Спасибо
4 ответа
Используйте /ToolsVersion:3.5
Согласно http://blogs.msdn.com/b/msbuild/archive/2006/11/15/multi-targeting-how-does-it-work.aspx
ToolsVersion - это параметр, который используется для принудительного создания проекта с использованием определенного набора инструментов.
Вы можете попробовать проверить путь SDK, построив этот проект:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="GetPath">
<GetFrameworkSdkPath>
<Output
TaskParameter="Path"
PropertyName="SdkPath" />
</GetFrameworkSdkPath>
<Message Text="$(SdkPath)"/>
</Target>
</Project>
Я могу ошибаться, но путь C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727, который вы видите, кажется неправильным.
Это должны быть C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\ или C:\Program Files\Microsoft SDK \Windows\v6.0A.
При дальнейшем расследовании я обнаружил истинную причину ошибки. Напомним, что приложение, которое я создаю:
Это веб-сервис, созданный в фреймворке 3.5, пытающийся создать проект на C#, разработанный с использованием фреймворка 2.
Когда вы добавите две ссылки, Microsoft.Buld.Engine и Microsoft.Build.Framework, вы заметите, что существует две версии каждой. Одна версия является версией Framework 2, а одна - версией Framwork 3.5. Поскольку проект, который я пытался построить, выполнен в framework 2, я импортировал версию framework 2. Вот где лежит ошибка.
Решение: BinPath должен быть единственной ссылкой на структуру два, а именно: "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727". Microsoft.Buld.Engine и Microsoft.Build.Framework должны указывать на версию 3.5, поскольку приложение, создающее здание, разработано в фреймворке 3.5. Я полагаю, если бы он был разработан в рамках 2, у меня никогда не было бы проблемы во-первых.
Вы можете попробовать вот так:
Найдите сборку из C:\Program Files\ Справочные сборки \Microsoft\Framework\v3.5\Microsoft.Build.Engine.dll. Скопируйте и вставьте в расположение GAC, как указано ниже:
C: \ Windows \ сборка \GAC_MSIL\Microsoft.Build.Engine\3.5.0.0__b03f5f7f11d50a3a
работает. проблема из-за отсутствия файла GAC.