首页 > 解决方案 > 为什么 Visual Studio 将 DLL/EXE 复制到 c# 中引用的项目构建文件夹中?

问题描述

假设我有四个项目:

A B C D

使得 A 引用 B,B 引用 C,C 引用 D。

正如预期的那样,在 Visual Studio (2017) 中,建筑 A 也触发了 B、C、D 中的构建。它只构建一次。但是,似乎构建将 DLL 复制到每个项目的 bin 目录中,使目录结构(假设在调试模式下构建)看起来像这样:

A -> bin -> 调试 -> A.exe、B.exe、C.exe、D.exe

B -> bin -> 调试 -> B.exe、C.exe、D.exe

C -> bin -> 调试 -> C.exe, D.exe

D -> bin -> 调试 -> D.exe

这似乎暗示有一个 O(n^2) ,其中 n 是项目的数量(并且它们像这样相互引用)就复制的可执行文件/dll 的数量而言。这导致构建时间与项目数量的可怕缩放。然而,拥有更多的项目对于增加文件的粒度变得非常必要。

在最坏的情况下,对于 n 个项目,添加另一个项目会导致 (n + 1) 个额外的文件副本,使用 (1 + 2.. + n) = (n(n+1))/2 公式。

为什么视觉工作室会这样做?为什么不只复制到 A 的 bin 目录?我看到当前方法的唯一优点是您可以在 B、C 和 D 的 bin 文件夹中运行 DLL/EXE。

标签: c#visual-studiomsbuild

解决方案


看起来可以关闭此行为。它的名称是 Visual Studio 中的 copylocal 属性。如果您将其关闭,那么您现在负责将 DLL 手动复制到输出文件夹所在的位置(例如,通过自定义 MSBuild 步骤)。

这些问题很好地解决了它:

“复制本地”和项目参考的最佳实践是什么?

Visual Studio 中大型解决方案的最佳实践 (2008)


推荐阅读