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

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

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

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

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

Ответ 1

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

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

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 Bin.

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

Ответ 2

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

Откройте 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" />

Ответ 3

Я благодарен Энди Махаффи за его ответ, без этого я бы не нашел того, что сделал. Я следовал по его линии исследований, но мне не нравилась идея просто изменить атрибуты UseTasks. Я открыл файл "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')"/>
  -->

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

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

TL;DR

Вставьте строку ниже как последний элемент перед тегом в следующем файле. 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')"/>

Ответ 4

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