引用的 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】:
您可以做的最好的事情是将项目 A
、B
和 C
全部放在一个 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 未复制的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 发布未将所有 DLL 复制到发布文件夹