Ошибка 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, один в подпапке, где я этого не заметил. Как только я удалил лишний, все было в порядке.