首页 > 解决方案 > 构建时编辑时 Visual Studio 的行为

问题描述

在 Visual Studio 2017 (15.9.16) 中,我可以在使用 Debug > Start Debugging 命令 (F5) 开始构建后继续编辑源文件。虽然我专门针对 C# 编译器提出了这个问题,但了解 C++ 的行为是否不同也会很有趣。

当我在附加调试器后进行编辑并启用编辑并继续时,编辑会带有波浪形的紫色下划线,一切都很清楚。

当我在调试器附加之前进行编辑,并且在构建成功之前保存我的编辑时,整个事情似乎处于不确定状态。要么我的编辑太晚了,调试器就会执行已经构建的代码(除了空心断点项目符号,如果有的话,不明显)。或者它是及时的,并且被包括在内。

当决定是否仍将包含最近的编辑时,构建时间线中的点在哪里?通过构建开始的时间戳?不定?在编译器处理源文件之前?链接器是否检查 obj 是否是从启动后更改的源生成的?

标签: c#visual-studiomsbuildedit-and-continue

解决方案


构建时编辑时 Visual Studio 的行为

面对这种行为,C#C++项目表现出两种不同的表现:

对于c#项目,实际上,当您选中该选项时Enable Edit and Contniue,只有当您将断点执行箭头返回到更改部分时,代码更改才会应用到调试器中。但是这些更改被放入一个临时库中,仅用于调试目的,并没有构建到输出路径(<code>obj 和bin)中。仅当您在中断和再次调试时开始构建时才包含此内容。这就是 C# 机制。

这与 C++ 项目相反。

对于C++项目,当您将光标移动到 c++ 项目的修改部分时,它会触发 build 任务重新编译项目,这将直接包含这些更改。这是在构建过程中包含修改部分的时间。

您可以在构建过程中保存对源文件的更改多长时间,以便它们的最新版本仍将包含在正在进行的构建输出中?

对于C++项目,一旦将光标移动到修改部分以触发重建任务,修改部分将永久包含在构建文件中。在此过程中,您无需再次构建项目。

如果你调试一个C#项目,当你把光标移动到修改的部分时,这并不会触发自动构建任务,所以这个部分不会自动包含在输出文件中,而只是在当前调试阶段。

因此,当您完成当前调试过程然后再次开始调试时,这将触发构建过程或直接单击构建按钮,以便这些编辑可以永久包含在构建文件中。

总的来说,当你点击调试按钮时,构建过程会自动触发,所以你可以稍后调试。一旦触发构建,这些部分将永久包含在构建文件中。

您可以在“输出”窗口中看到所有这些。


推荐阅读