引用的 DLL 未复制

Posted

技术标签:

【中文标题】引用的 DLL 未复制【英文标题】:Referenced DLL not copied 【发布时间】:2013-11-01 17:20:40 【问题描述】:

我有一个项目(称为 A,它是一个 exe),它引用了另一个项目(称为 B,它是一个类库),它引用了一个 dll(称为 C)。从 Visual Studio 调试 A.exe 时出现运行时错误:

在 B.dll 中发生了“System.IO.FileNotFoundException”类型的未处理异常。附加信息:无法加载文件或程序集“C”、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null'或其依赖项之一。系统找不到指定的文件。

当我进入我正在执行的 bin\debug 目录时,果然没有 C.dll。

我已经从 B.dll 显式调用了 C.dll 中的类,因此没有任何奇怪的运行时添加引用或反射来调用它。我还在 C.dll 上将“复制本地”设置为 true。如果我直接从 A.exe 引用 C.dll,那么它运行没有问题,但我宁愿不必这样做。

我尝试在新的解决方案中重现该问题,但我无法做到。

有谁知道是什么阻止了这个 dll 复制到最终输出目录?

【问题讨论】:

您如何从B 引用C?项目参考? @christiandev C 是对 dll 的引用 @christiandev C 不是解决方案的一部分,因此它不是项目参考。 @terrybozzio C 被 B 通过浏览 dll 引用。 所以,C实际上是一个DLL,而不是一个类库项目。 Project A 需要引用 C 【参考方案1】:

您可以做的最好的事情是将项目 ABC 全部放在一个 Visual Studio 解决方案中,然后您可以参考您需要的其他项目,而无需引用 dll。

一旦你有了它,然后像这样添加一个项目参考:

项目 B 引用项目 C 项目 A 引用项目 B

因为您随后引用了 项目,所以当您编译整个项目时,它将拉动必要的 dll。

但是,正如 neo 所说,如果您将 C 保留为 dll,那么 A 也必须引用它,因为 VS 还不够聪明,无法复制它。

【讨论】:

【参考方案2】:

我也遇到过类似的问题,所以我建议尝试以下方法:

将“复制本地”切换为“false”,然后再次切换为“true”,如果问题丢失,它应该可以解决问题 < Private > True < /Private >项目文件中的节点 检查您项目的目标框架,我有几个针对“4.0 框架”和其他“4.0 客户端配置文件”的项目有类似的问题,在每个项目切换到“4.0”后得到解决

【讨论】:

尝试更改本地副本无济于事。框架在主项目上是 4.5,在另一个项目上是 2.0。谢谢你的想法,我以前被咬过。【参考方案3】:

好吧,终于明白了……我想。

看起来C项目在Application-->Assembly Information下没有任何版本信息。它还缺少一个向导。

作为记录:您可以参考我描述的方式(A refs B which refs C)并复制输出。我确实回到了 dll 引用而不是项目引用,并且在清理和构建后它仍然有效。

我仍然不确定为什么我能够让它在新解决方案中工作(在进行更改之前),但我现在已经启动并运行了。

编辑: 另请注意,项目中似乎没有 assembly.cs(这就是它没有任何版本信息的原因)。我想知道它是否只是这个项目的重新编译,可以修复它而不是更新程序集信息。

【讨论】:

我不知道为什么添加这些信息会有所不同,但不管怎样…… 如果有人知道我很乐意将他们的答案标记为正确!

以上是关于引用的 DLL 未复制的主要内容,如果未能解决你的问题,请参考以下文章

引用 DLL 文件未与部署项目一起复制到 bin,导致错误

未复制到输出目录的引用的依赖关系

Visual Studio 发布未将所有 DLL 复制到发布文件夹

从属 DLL 未复制到 Visual Studio 中的生成输出文件夹

Netcore 2.0 发布未复制 SDK dll

引用程序集或 dll 是不是应该复制到部署目录中?