Ошибка EntityDeploySplit - отсутствует Microsoft.Data.Entity.Build.Tasks.dll

После чистого переформатирования Windows и установки Visual Studio 2013 при попытке создать проект с использованием файлов EDMX Entity Framework, ориентированных на базу данных, выдается следующая ошибка:

Не удалось загрузить задачу "EntityDeploySplit" из сборки C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Data.Entity.Build.Tasks.dll. Не удалось загрузить файл или сборку 'file:///C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Data.Entity.Build.Tasks.dll' или одну из ее зависимостей. Система не может найти указанный файл. Убедитесь, что объявление правильное, что сборка и все ее зависимости доступны и что задача содержит открытый класс, реализующий Microsoft.Build.Framework.ITask.

Есть ли способ установить это отдельно? Что входит в эту сборку по умолчанию?

ОБНОВЛЕНИЕ: Это также проявляется при поиске задачи EntityClean. Я склонен думать, что сначала он проверяет мусорное ведро, поскольку другой разработчик, который работал нормально, попытался очистить / перестроить, а затем это начало появляться.

4 ответа

Решение

Я столкнулся с этой проблемой и смог исправить ее, как я описал ниже. Ваши пути и переменные могут быть разными.

Я обнаружил, что когда мой проект собирается, он указывает на этот целевой файл:

C:\Program Files (x86)\MSBuild\12.0\Bin\Microsoft.Data.Entity.targets

Этот целевой файл выглядит просто как заполнитель. В этом файле есть элемент Import, который указывает на $(MSBuildFrameworkToolsPath)\Microsoft.Data.Entity.targets который запускает целевой файл, расположенный по этому пути. Я искал реестр и обнаружил, что MSBuildFrameworkToolsPath это запись реестра со значением C:\Windows\Microsoft.NET\Framework\v4.0.30319\

Я пошел к файлу целей, который был указан, и искать UsingTask элемент, который был указан в моем исключении. Внутри UsingTask элемент, AssemblyFile атрибут был указан $(MSBuildBinPath)\Microsoft.Data.Entity.Build.Tasks.dll, Я искал в реестре и обнаружил, что запись реестра MSBuildBinPath была указана на c:\Windows\Microsoft.NET\Framework\v3.5\

Я не уверен, почему это было указано на это, может быть, установка Framework или Visual Studio не очистила его. Наконец я изменил все свои UsingTask элементы AssemblyFile приписывает:

$(MSBuildFrameworkToolsPath)\Microsoft.Data.Entity.Build.Tasks.dll

Я использовал ту же переменную, которая была в целевом файле бина MSBuild.

Надеюсь это поможет.

Я нашел принятый ответ немного запутанным, ниже приведены шаги, которые работали для меня.

Откройте C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Data.Entity.targets в блокноте.

Измените элементы UsingTask на:

  <UsingTask TaskName="EntityDeploySplit"
             AssemblyFile="Microsoft.Data.Entity.Build.Tasks.dll" />

  <UsingTask TaskName="EntityDeploy"
             AssemblyFile="Microsoft.Data.Entity.Build.Tasks.dll" />

  <UsingTask TaskName="EntityDeploySetLogicalNames"
             AssemblyFile="Microsoft.Data.Entity.Build.Tasks.dll" />

  <UsingTask TaskName="EntityClean"
             AssemblyFile="Microsoft.Data.Entity.Build.Tasks.dll" />

Я очень благодарен Энди Махаффи за его ответ, без него я бы не нашел того, что сделал. Я продолжил его исследования, но мне не понравилась идея просто изменить атрибуты UsingTasks. Я открыл файл "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Data.Entity.targets" и обнаружил, что первое, что он говорит после открывающего элемента Project, это комментарий:

  <!-- This .targets file can be used by updating Microsoft.Common.targets to 
         include the line below (as the last import element just before the end project tag)
      <Import Project="$(MSBuildBinPath)\Microsoft.Data.Entity.targets" Condition="Exists('$(MSBuildBinPath)\Microsoft.Data.Entity.targets')"/>
  -->

Я последовал его предложению и давности, проблемы решены.

Надеюсь, это поможет!

TLDR

Вставьте строку ниже как последний элемент перед тегом в следующем файле. C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets

<Import Project="$(MSBuildBinPath)\Microsoft.Data.Entity.targets" Condition="Exists('$(MSBuildBinPath)\Microsoft.Data.Entity.targets')"/>

В моем случае я случайно создал две копии одного из моих файлов.edmx, один в подпапке, где я этого не заметил. Как только я удалил лишнюю, все было хорошо.

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