最终编译的程序集中.Net中项目和dll依赖关系的区别

Posted

技术标签:

【中文标题】最终编译的程序集中.Net中项目和dll依赖关系的区别【英文标题】:Difference between project and dll dependencies in .Net in the final compiled assembly 【发布时间】:2011-04-12 11:55:06 【问题描述】:

假设我有两个项目 A 和 B。A 依赖于 B。我可以通过两种方式指定:

在同一解决方案中包含 A 和 B,并将 B 指定为 A 的项目依赖项。这在 A 的 msbuild 项目中显示为“ProjectReference”节点。 包括对 B 的已编译 dll 的引用作为 A 的依赖项。这在 A 的 msbuild 项目中显示为“引用”节点

我的问题是,一旦我为 A 构建了程序集,这两种方法的最终输出是否存在差异。

我尝试创建几个简单的项目来模拟这种关系并尝试进行比较 - 但不同的比较工具告诉我不同​​的事情。在写一些逐字节比较这些文件的东西之前,我想知道你们是否对此有所了解。具体来说,如果我使用 dll 引用而不是项目引用,构建程序集的行为是否会有任何差异。

【问题讨论】:

【参考方案1】:

如果项目 B 的源代码在项目 A 的两次构建之间没有发生变化,则项目 A 输出的行为不会有任何差异。但是,如果项目 B 的源已更改,则将其作为项目 A 的项目引用将导致项目 B 也被重建。这种差异决定了您选择如何从项目 A 中引用项目 B:

如果您同时拥有项目 B 和项目 A 的源代码,并且它们是紧耦合的,或者如果它们都在积极开发中并且项目 B 的公共接口经常发生重大变化,那么您希望引用项目B 作为项目。这将确保项目 A 在其构建中始终使用项目 B 的最新输出。

如果项目 B 是您不自己开发的外部依赖项,或者您没有源代码,或者如果它已经发布并且您无法与项目 A 一起发布修改版本,您想要引用预构建的项目 B 输出,以确保您使用最有可能在用户计算机上的相同版本的项目 B 进行开发和测试。

【讨论】:

@Timwi - 感谢您直接设置依赖方向 :-) 出于某种原因,我写它与 OP 的示例完全相反 另外补充一下,如果你的项目 B 依赖于比如说 C.dll,如果 B 被指定为 A 的项目依赖,编译项目 A 会自动带来项目 B 的依赖(例如C.dll)。相反,如果您包含对 B 的已编译 dll 的引用,则不会将 C.dll 自动添加到 A 的 bin 中,而是需要手动添加 B 的所有依赖项。【参考方案2】:

添加为项目引用的好处是,如果需要,程序集“B”会自动构建。

一旦构建了程序集“A”,就没有区别了。

【讨论】:

以上是关于最终编译的程序集中.Net中项目和dll依赖关系的区别的主要内容,如果未能解决你的问题,请参考以下文章

在安装项目中包含文件依赖项

C++、Qt - 如何摆脱 dll 依赖项?

同一个解决方案或有依赖关系的两个项目引用同名但不同版本的DLL

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

第三方 dll 在 ASP.NET MVC 项目中找不到它的依赖项

使用 Roslyn 编译时自动解析依赖关系