c# - 为什么 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。
解决方案
看起来可以关闭此行为。它的名称是 Visual Studio 中的 copylocal 属性。如果您将其关闭,那么您现在负责将 DLL 手动复制到输出文件夹所在的位置(例如,通过自定义 MSBuild 步骤)。
这些问题很好地解决了它:
推荐阅读
- powershell - 在 Poweshell 中找到字符串后需要一种方法来写入文件的剩余数据
- database - MongoDB中的多个查找
- javascript - 是否可以使用此概念实现滑块或拨号元素?
- arrays - 索引超出范围 [1],长度为 0
- angular - NGXS - 错误:属性没有初始化程序,并且没有在构造函数中明确分配
- python - python程序打印可能的最小数字例如:输入23780输出:20378
- android - 如何为绘图/素描创建自定义视图(画布),可以像在 Evernote 应用程序中一样在任何方向上无限滚动/拖动
- python - Django 管理员“现场查看”返回 NoReverseMatch,但 url 都可以在其他地方工作
- laravel - 在 laravel 仪表板和颤振应用程序之间建立聊天系统的最佳方法是什么
- ios - 想在 iOS 中使用 RxSwift 做搜索过滤器