为什么Visual Studio将DLL / EXE复制到C#中的引用项目构建文件夹中?

时间:2019-07-06 11:45:55

标签: c# visual-studio msbuild

说我有四个项目:

A 乙 C D

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

在Visual Studio(2017)中,建筑物A也按预期触发了B,C,D中的建筑物。它只会构建一次。但是,似乎该版本将DLL复制到每个项目的bin目录中,而目录结构(假设以Debug模式构建)看起来像这样:

A ->   箱子     ->调试        -> A.exe,B.exe,C.exe,D.exe

B ->   箱子     ->调试        -> B.exe,C.exe,D.exe

C ->   箱子     ->调试        -> C.exe,D.exe

D ->   箱子     ->调试        -> D.exe

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

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

Visual Studio为什么要这样做?为什么不只复制到A的bin目录?我对当前方法的唯一好处是可以在B,C和D的bin文件夹中运行DLL / EXE。

1 个答案:

答案 0 :(得分:0)

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

这些问题处理得很好:

What is the best practice for "Copy Local" and with project references?

Best practices for large solutions in Visual Studio (2008)