参考 Copy Local dll from another project in same solution not copyed into output folder

Referenced Copylocal dll from other project in same solution not copied into output folder

我有一个解决方案,里面有 3 个项目(1 个 GUI、1 个 BLL、1 个 DAL)。 dal 和 bll 都引用 EntityFramework 和 EntityFramework.SqlServer 并将 copylocal 设置为 true(BLL 还引用 DAL 并将 copylocal 设置为 true)。

GUI 引用 BLL 和 DAL,copylocal 为 true。

现在,当我将 GUI 设置为启动项目时,构建过程工作得很好。调试文件夹然后在 除了 EntityFramework.SqlServer 中包含所有必需的文件和 dll。

我检查了几次 EntityFramework 和 EntityFramework.SqlServer 是否在任何地方都有相同的设置,...他们有。我试图将它手动复制到 GUI 调试文件夹,然后清除项目.....文件仍然存在,这表明 visual studio 认为该文件不是构建过程的一部分。

因此我的问题是双重的:

  1. 是什么导致了这种现象?
  2. 我该怎么办?

最初的问题是您对 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 列表中找到它们。

所以要自己复制。