【发布时间】:2017-05-17 03:58:30
【问题描述】:
我们的解决方案包含大量 C# 项目。它们之间存在复杂的依赖关系,例如。项目A/B/C,A依赖B,B依赖C。如果我在项目C中更改了一个文件,然后重建解决方案,项目A,B,C将一起重建。
在 C++ 中,构建包含两个过程,编译和链接。如果我更改项目C中的一个文件,然后我构建解决方案,将编译A和B中的相关文件(其他文件不会编译,它们的.obj将在链接过程中重复使用),然后进行链接。
在java中,只会重新编译项目C中更改的文件,其他文件将保留然后打包为.jar。它重用以前的工作输出(未更改文件的 .class)。
总之,C# 不会重用任何以前的工作输出。它没有任何中间文件,就像 Java 的 .class 和 C++ 的 .obj 一样。 所以在这一点上,我觉得 C# 不做增量构建过程。一些小的变化将导致一个大的构建过程。我不明白为什么 C# 不使用以前的工作输出来加速构建过程。
我不确定我对 C# 编译/构建过程的理解是否正确。你能帮忙解释一下吗?非常感谢。
【问题讨论】:
-
您可以考虑编写一个 Windows 批处理文件,您可以在其中提及所有依赖项和构建文件夹并一次性构建它们。
-
Eric Lippert 早在 2010 年写了一篇题为 How many passes? 的好帖子:“C# 语言不要求在使用之前发生声明......对用户的影响是你无法到达仅重新编译更改文件时更改的 IL ... 另一种看待这一点的方式是,C# 中重新编译的“粒度”是在项目级别,而不是文件级别”
-
在 Visual Studio 的解决方案资源管理器窗口中,右键单击解决方案并查看项目/解决方案构建顺序。这也显示了项目的依赖关系。
标签: c# build-process