关于@herzbube 发布的解决方案,如果您想为 .csproj 文件中的所有(或大部分)引用关闭“复制本地”,则无需设置<Private>False</Private> 分别在每个 Reference 上,您可以直接在 .csproj 中输入以下内容:
<ItemDefinitionGroup>
<Reference>
<Private>False</Private>
</Reference>
</ItemDefinitionGroup>
这不会影响使用 <ProjectReference> 引用的项目,但您可以为这些项目做同样的事情 - 或者也可以这样做:
<ItemDefinitionGroup>
<ProjectReference>
<Private>False</Private>
</ProjectReference>
</ItemDefinitionGroup>
如果你想要这两个,你可以将它们合并到一个组中:
<ItemDefinitionGroup>
<Reference>
<Private>False</Private>
</Reference>
<ProjectReference>
<Private>False</Private>
</ProjectReference>
</ItemDefinitionGroup>
确保将这些覆盖放在您想要影响的第一个实际<Reference … > 或<ProjectReference … > 之前,因为这些块仅适用于出现在它们下方的那些引用。然后,如果您确实确实想要在本地复制一些内容,则可以单独覆盖那些back(即,在单个标签本身),这次使用True。
对于更高级的情况,您可以在同一个 .csproj 文件中多次在 True 和 False 之间来回切换覆盖值。另一种先进的技术是策略性地将您的一些引用放置在这些块下方,而其他一些则放在上面,这样后者就不会受到影响。
所有这些都应该使您的 .csproj 中的 XML 更加清晰和易于阅读。但是还有更多好消息,请继续阅读...
至于选择哪些项目应该标记<Private>False</Private>,这通常取决于具体情况,但有一些基本的每个人可以和应该为初学者做。这是一个如此基本、简单和有效的步骤,它提供了如此巨大的 MSBuild 可靠性改进1. 和构建时间加速 - 而且几乎没有缺点 - 每个大型解决方案使用默认(即每个项目的本地)C# 输出位置几乎总是应该进行此调整:
在构建多个 C# 类库的任何 Visual Studio 解决方案中,具有任意数量的 <ProjectReference> 相互依赖关系,最终构建一个更多应用程序(即可执行文件):
-
在每个类库的 .csproj 顶部附近,插入上面显示的 <ProjectReference> 块。
原因:任何 .dll 都不需要将它引用的任何库收集到它自己的子目录中,因为从该位置没有运行任何可执行文件。如此猖獗的复制是无用的忙碌工作,并且可能会不必要地减慢您的构建速度,甚至可能非常显着。
-
另一方面,不要为您解决方案的任何应用程序修改 .csproj。
原因:可执行文件需要在其各自的子目录中拥有所有他们需要的私有库,但是每个应用程序的构建应该负责单独收集每个依赖项,直接从其各自的子目录到应用程序的子目录中目录。
这非常有效,因为一个类库的 .csproj 可以引用多个其他类库,但一个可执行文件的 .csproj 通常从不引用另一个可执行文件。因此,对于每个本地构建的库,其 bin 文件夹中唯一的 .dll 将是其自身,而每个本地构建的 application 将包含完整的本地- 构建它引用的库。
方便的是,对于不是由您的解决方案构建的引用库,没有任何变化,因为这些库通常使用<Reference> 而不是<ProjectReference>,我们根本没有修改前一个标签。但请注意刚才提到的假设;如果您的某些项目违反了它,您可能需要进行一些调整。
[1.] 可靠性改进可能与从依赖关系图中的多个不相交路径收集相同库时可能发生的文件冲突有关,尤其是在并发构建中。