在干净的Windows重新格式化并安装Visual Studio 2013之后,尝试使用数据库优先的Entity Framework edmx文件构建项目会产生以下错误:
无法从程序集加载“EntityDeploySplit”任务 C:\ Program Files (86)\的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任务时,这也会显示出来。我倾向于认为它首先检查bin,因为另一个运行它的开发人员尝试了干净/重建然后开始出现。
答案 0 :(得分:14)
我发现接受的答案有点令人困惑,下面是对我有用的步骤。
在记事本中打开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" />
答案 1 :(得分:8)
我遇到了这个问题,并且能够解决它,如下所述。您的路径和变量可能不同。
我发现当我的项目构建时,它指向这个目标文件:
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 :(得分:1)
我对Andy Mahaffey的答案给予了很多赞誉,没有它,我就不会找到我所做的。 我跟着他的研究方向,但不喜欢只改变UsingTasks&#39;属性。我打开了&#34; C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Data.Entity.targets&#34;文件和我发现在打开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')"/>
-->
我遵循了它的建议和解决方案,解决了问题。
我希望这有帮助!
将下面的行粘贴为以下文件中标记之前的最后一个元素。 C:\的Windows \ Microsoft.NET \框架\ v4.0.30319 \ Microsoft.Common.targets
<Import Project="$(MSBuildBinPath)\Microsoft.Data.Entity.targets" Condition="Exists('$(MSBuildBinPath)\Microsoft.Data.Entity.targets')"/>
答案 3 :(得分:0)
在我的情况下,我不小心创建了我的一个.edmx文件的两个副本,一个在子文件夹中,我没有注意到它。一旦我删除了额外的一个,一切都很好。