从同一解决方案中的另一个项目引用复制本地DLL未复制到输出文件夹中

时间:2015-02-26 10:26:49

标签: c# visual-studio-2013

我有一个包含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认为该文件不是构建过程的一部分。

因此,我的问题有两个:

  1. 可能导致这种现象的原因是什么?
  2. 我能对此做些什么?

1 个答案:

答案 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列表中找到它们。

所以你必须自己复制。