强制Visual Studio在调试时始终执行“重新生成全部”

11

编辑:我需要的是让Visual Studio在我按下调试按钮时始终重新构建全部内容。


我目前正在使用Visual Studio编译我的汇编程序,使用MASM,总体上效果还不错。

然而,我遇到了一个恼人的问题:

如果我像这样包含一个文件(比如说一个带有函数的文件)

Include functions.inc

如果我编译并且它起初可以正常工作。但是,如果我更改 functions.inc 的内容,则不会被识别,编译器会跳过 functions.inc 并使用更改前的旧版本。

我无法在项目属性下找到任何选项来解决这个问题。但是我确定它与链接器选项有关 - 如果我在项目属性下进行任何更改(即使我更改后再次更改并按下 OK),它将使用新版本的 functions.inc 正确编译。

有什么想法吗?


4
尝试编辑自定义构建规则并在“附加依赖项”中添加*.inc。最终的解决方法是执行“生成”和“重建”。 - Hans Passant
重建是我现在正在使用的。有点烦人,但我将ctrl+r映射到它上面,所以很快。我会尝试额外的依赖项想法,并回复是否有效。 - Cam
请参考以下答案: https://dev59.com/vEnSa4cB1Zd3GeqPKxE9 - userSteve
这在VS2015中怎么可能实现? - user4628051
5个回答

8
您可以通过Visual Studio的宏资源管理器中的EnvironmentEvents宏来更改行为:
Private Enum IDEMode
    Design = 1
    Break = 2
    Run = 3
End Enum

Private _IDEMode As IDEMode = IDEMode.Design

Public Sub DTEDebuggerEvents_OnDebugRun() Handles _
DebuggerEvents.OnEnterRunMode
    If _IDEMode = IDEMode.Design Then
        DTE.ExecuteCommand("Build.RebuildSolution")
    End If
    _IDEMode = IDEMode.Run
End Sub

Public Sub DTEDebuggerEvents_OnDebugDesign() Handles _
    DebuggerEvents.OnEnterDesignMode
    _IDEMode = IDEMode.Design
End Sub

Public Sub DTEDebuggerEvents_OnDebugBreak() Handles _
    DebuggerEvents.OnEnterBreakMode
    _IDEMode = IDEMode.Break
End Sub

这是VisualStudio的更改,因此一旦设置,它将在所有解决方案中起作用。

更新 上述解决方案可行,但在涉及内容文件的情况下存在一些缺陷,即使调试器正在运行,IDE也会切换到设计模式。在某些情况下,它 尝试在调试器运行时构建。正确的解决方案是:

Private _curDebugState As EnvDTE80.dbgProcessState

Public Sub debuggerStateChangedHandler
    (ByVal NewProcess As EnvDTE.Process, 
    ByVal processState As EnvDTE80.dbgProcessState) 
    Handles DebuggerProcessEvents.OnProcessStateChanged
    If _curDebugState = dbgProcessState.dbgProcessStateStop And processState = dbgProcessState.dbgProcessStateRun Then
        DTE.ExecuteCommand("Build.RebuildSolution")
    End If
    _curDebugState = processState
End Sub

哈哈,我简直不敢相信。终于在六个月后找到了答案!非常感谢你 :) - Cam
3
嘿,我发现它是因为我自己在寻找解决方案,我遇到了同样的问题(虽然是在不同的情况下),看到 MSDN MVP 推广每次都手动重建的想法让我感到愤怒。 - Jaguar
仅针对特定解决方案是否可能? - Emil

6

请确保您已在“配置管理器”中选择了启动项目进行构建:

构建 -> 配置管理器 -> 检查所有相关项目的“构建”列。


1

在 VS 中支持 ASM 代码并不像 .NET/C++ 那样自动化,需要您进行一些帮助。我们使用 MAKE 文件在 VS 中编译我们的 ASM 代码。MAKE 文件定义了所有依赖项,因此 INC 文件的更改会在下次编译 ASM 文件时被编译。

可以使用 MSBuild 创建类似的构建脚本,但我们从未花时间去做过这个。


1

一个可能的解决方案是创建一个宏,它只需执行全部重建,然后启动调试器。然后将该宏映射到一个键。我认为_DTE.ExecuteCommand可以用于此。如果您想更多地控制调试器,则Debugger2接口公开了相当多的功能。


0

如果问题是VS IDE无法确定依赖关系(因为它无法解析.asm文件并定位其中的INCLUDE指令),那么一种非常有效的粗暴解决方案是重新构建项目甚至整个解决方案: MASM非常快:我有一些非常大的MASM项目,包含数十个.asm模块和更多的包含文件:最大的这样的项目可以在几秒钟内重建。

警告:前方有两个Kludge。 定义一个预构建,对所有.asm文件进行触摸将自动强制重新构建...

  1. 右键单击项目属性(左列,解决方案资源管理器)
  2. 转到“配置属性/生成事件/预生成事件”
  3. 在“命令行”中,输入“touch *.asm”(确保路径中有触摸实用程序)

现在每次构建时,所有*.asm文件都将被触摸(即出现修改),从而重新编译。您不必再记住必须重新构建所有内容,因为这将自动发生。我警告过这是一个Kludge了吧?此外,IDE将告诉您文件已在编辑器外部修改,是否要重新加载它们。你可以说是的!


保存首先并不能解决问题 - 我的设置已经是这样了。目前在每次运行之前我都使用“重建所有”,但我不想这么做。 - Cam
你考虑过在预构建步骤中运行“touch *.asm”吗?这不是很好,但至少你不必考虑调用不寻常的重建键序列... - filofel
你能详细说明一下吗? - Cam
花了我一些时间,但我想在回答之前进行检查和测试: 1)右键单击项目属性(左侧列,解决方案资源管理器) 2)转到“配置属性/生成事件/预生成事件” 3)在“命令行”中输入“touch *.asm”(确保路径中有touch实用程序)每次构建时,所有*.asm文件都将被触摸(即出现修改),因此会重新编译。您将不再需要记住必须重新构建所有内容,因为这将自动发生。我说过这是一个临时的解决方法,不是吗?此外,IDE可能会要求您重新加载文件。 :) - filofel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接