Ошибка 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.

Другие вопросы по тегам