我有一个包含3个项目的解决方案(1个GUI,1个BLL,1个DAL)。 dal和bll都引用EntityFramework和EntityFramework.SqlServer,并将copylocal设置为true(BLL也引用带有copylocal的DAL为真)。
GUI使用copylocal true引用BLL和DAL。
现在,当我将GUI设置为启动项目时,构建过程非常正常。然后,debug文件夹中的所有必需文件和dll都在中,除了 EntityFramework.SqlServer。
我检查过几次,如果EntityFramework和EntityFramework.SqlServer都有相同的设置,......他们有。我尝试将其手动复制到GUI调试文件夹,然后清除项目.....文件仍然存在,表明visual studio认为该文件不是构建过程的一部分。
因此,我的问题有两个:
答案 0 :(得分:1)
首要问题是您对EntityFramework有间接依赖关系。 MSBuild无法从您的EXE项目中发现需要这些程序集。但是,它可以从您对BLL和DAL项目的引用中间接发现它。
但它并不是盲目地复制那些项目的bin \ Debug文件夹中存在的所有。它查看BLL.dll和DAL.dll文件的元数据,它们包含对完成工作所需的程序集的引用。在这些DLL上使用ildasm.exe
时可以看到的内容。双击清单以查看,请注意您在那里看到的.assembly指令。你会看到:
.assembly extern EntityFramework
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 6:0:0:0
}
但请注意,您不要查看EntityFramework.SqlServer的.assembly指令。
降压停止的地方,MSBuild根本无法发现这个组件是必需的。或者换句话说,EntityFramework.SqlServer.dll就像一个插件。不同的数据库引擎有不同的插件。有很多,你可以在Nuget列表中找到它们。
所以你必须自己复制。