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