似乎区分文件依赖项也很重要,其中依赖项引用 dll 程序集文件和项目依赖项(即我要问的),其中依赖项引用项目并隐式引用该项目的输出文件。
不完全是,不。
MSBuild 并不真正关心引用是否指向解决方案中的另一个项目或 DLL。
If ProjectA
依赖于取决于ProjectB
建造ProjectA
ProjectB
必须已经构建(并且是最新的),MSBuild 将提取其 DLL(不是其 C# 代码)并将其链接到ProjectA
.
为了方便起见,添加项目引用而不是 DLL 是“语法糖”:这样 MSBuild 就知道它必须选择引用项目的输出,无论输出是什么。
否则,您必须手动预构建依赖项,找到其 DLL 并将其链接到项目,每当您切换构建配置、移动或重命名内容时都要重复该过程。不太实用。
另外两个dll也会被复制到输出目录吗?
如果直接从引用程序集的项目中使用依赖项中的任何类型的元素,则将复制该引用。
一个例子是这个解决方案布局:
- 我的解决方案
- MySolution.控制台应用程序
- MySolution.FirstDependency
- MySolution.第二个依赖项
- MySolution.第三个依赖项
- MySolution.FourthDependency
有了这个依赖链:
- MySolution.控制台应用程序
- MySolution.FirstDependency
- MySolution.SecondDependency
- MySolution.第三个依赖项
- MySolution.FourthDependency
如果您构建此解决方案,您会注意到MySolution.ConsoleApplication
输出目录将包含 DLLMySolution.FirstDependency
, MySolution.SecondDependency
and MySolution.ThirdDependency
但没有 DLLMySolution.FourthDependency
.
为什么会这样呢?当 MSBuild 构建时MySolution.SecondDependency
它注意到有一个依赖项被声明为MySolution.FourthDependency
,但因为它无法从中找到任何类型元素的任何用法MySolution.FourthDependency
in MySolution.SecondDependency
它决定执行一些“优化”并省略的代码MySolution.FourthDependency
集会从输出。
过去,当我通过 NuGet AutoMapper 添加到“深度依赖项”时,同样的问题困扰着我:添加 AutoMapper 会添加两个程序集引用,AutoMapper
and AutoMapper.Net4
,当需要对 .NET Framework 4 引入的新集合对象执行某种操作时,第二个程序集由第一个程序集通过反射加载。由于第二个程序集是通过反射加载的,因此 MSBuild 认为它未使用,因此不会懒得复制它。
So, yes,只要您直接使用它们,它们就会被复制而不是通过反思。
这有记录在某处吗?
这种行为似乎是 MSBuild 的一个“功能”,当我遇到这个问题时,我设法找到了 Microsoft 一些人的博客文章,但目前我无法再次找到它。