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

Posted

技术标签:

【中文标题】未复制到输出目录的引用的依赖关系【英文标题】:Dependencies of references not copied to output directory 【发布时间】:2010-09-27 08:18:36 【问题描述】:

我有一个 CommonUtils 库,我已将其构建到一个 dll 中,我从我的几个项目中引用了该库。 CommonUtils 依赖于在构建 CommonUtils.dll 时设置为文件引用和 copy-local=true 的 log4net.dll。 log4net.dll 和 CommonUtils.dll 不在 GAC 中。

在 MyWorkingProject 中一切正常,我只有一个对 CommonUtils.dll 的文件引用 - log4net.dll 显示在输出目录中(因为它是 CommonUtils.dll 的依赖项,但未从 MyWorkingProject 引用)。 但是,如果我创建一个新项目来添加一些单元测试:MyWorkingProjectTest 和项目引用 MyWorkingProject,然后在此处再次文件引用 CommonUtils.dll(我想使用一些 CommonUtils),然后在构建 log4net.dll 时,这两个项目都是依赖项参考和文件参考也不会被复制到输出目录。

谁能澄清这里发生了什么?编译器是否不知道它应该抓取哪个 log4net.dll 文件?我在这里做错了什么吗?我应该以其他方式执行此操作以显式复制 log4net.dll 吗? 我必须明确引用 log4net 是否有意义?

【问题讨论】:

【参考方案1】:

这是设计使然。您需要考虑自动继承引用会导致的影响。虽然您可以从逻辑上看到引用应该是什么,但编译器没有这样的描述。从理论上讲,如果它遍历整个依赖关系树,您最终可以复制框架和操作系统的大部分。

这绝对是一种痛苦,我同意并理解你的沮丧,但我认为微软无法找到合理的方法来做到这一点。

【讨论】:

你能建议我应该怎么做吗?如果我有 LibA 和 LibB,它们都依赖于 log4net,并且位于 MyProjDir/LibA 和 MyProjDir/LibB 中,它们都包含 log4net.dll。我应该参考哪个 log4net.dll?在构建 libA 和 libB 时,log4net.dll 的本地复制是否正确? 我个人将任何共享引用添加到***项目。例如,如果您的两个库都将被应用程序使用,我会将 log4net.dll 直接添加到应用程序的 /bin 文件夹中。这不是最好的解决方案,但我发现它比寻找参考更容易。 "按应用程序" = "按应用程序"。另外,说我添加对顶层的引用是欺骗性的。我没有添加引用 - 我只是添加到 /bin 文件夹,因为它将位于查找它的库的探测路径中。 好的,我明白了,所以我可以添加一个后期构建任务来显式复制它,而不是使用设置为复制 local = false 的 log4net 参考构建我的 CommonUtils?【参考方案2】:

我相信如果您不在项目中添加 log4net 作为参考,它将不会被复制。

【讨论】:

如何将 log4net 添加为项目参考,因为我只有分布式二进制 dll。还有为什么我必须添加对它的引用,因为它只是我的一个引用的依赖项。有人说你不应该引用你没有在代码中明确使用的库。 我的意思不是“项目参考”,而是您项目中的“参考”。【参考方案3】:

当我过去遇到类似情况时,我在 Visual Studio 中收到编译器警告,告诉我需要添加对依赖库的引用。

您在编译时是否收到这样的警告?如果是这样,请按照它给出的建议,您应该会发现 Log4net 已复制到您的输出目录。

【讨论】:

问题是我有两个依赖于 log4net 的引用,并且似乎 Visual Studio 有一些内置的东西不会复制冲突的依赖项(尽管它是同一个)。如果我只引用 1,那么一切都按预期工作,但如果我同时引用两者,它就不会被复制。 ? 两个引用真的是同一个程序集吗?检查每个引用的属性以确保路径相同。

以上是关于未复制到输出目录的引用的依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

未解决供应商目录中的依赖关系

从命令行使用时,如何让 Ivy 将依赖项复制到 lib 目录?

获取使用未声明的依赖关系[关闭]

具有javascript依赖关系的lit-element,未打包为es6模块(尚未)

模式对象依赖关系:减少无效的文档中提到的指南真的有意义吗?

查找未使用的gradle运行时依赖项