问题 强制visual studio在调试时始终“重建所有”


编辑:基本上我需要的是Visual Studio在我调试时总是重建所有内容。


我目前正在使用visual studio来编译我的汇编程序,使用MASM,一般来说它工作正常。

但是我遇到了一个恼人的问题:

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

Include functions.inc

并编译它,它原来工作正常。但是,如果我那么 更改 functions.inc的内容,这是不被识别的,编译器会跳过functions.inc并使用我之前更改它的旧版本。

我找不到项目属性下的任何选项来解决这个问题。但是我确定它与链接器选项或其他东西有关 - 如果我在项目属性下进行任何更改(即使我更改了某些内容并将其更改回来,然后按OK),它确实可以使用新版本的functions.inc。

有任何想法吗?


7896
2018-03-04 04:07


起源

尝试编辑自定义生成规则并将* .inc添加到其他依赖项。终极后备是Build + Rebuild。 - Hans Passant
重建是我现在正在使用的。有点讨厌,但我确实把ctrl + r映射到它所以它很快。我将尝试其他依赖关系的想法,并回顾它是否有效。 - Cam
另见这个答案 stackoverflow.com/questions/1334774/... - userSteve
VS2015如何实现这一目标? - Florian Neiss


答案:


您可以通过改变行为 EnvironmentEvents Visual Studio的宏资源管理器中的宏:

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的更改,因此一旦设置,它将适用于所有解决方案

UPDATE 上面的解决方案有效,但它有一些关于内容文件的缺陷,即使调试器正在运行,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

8
2017-08-31 10:02



哈哈,我简直不敢相信。我终于得到了答案 六个月!非常感谢 :) - Cam
嘿,我找到了它,因为我自己正在寻找一个解决方案,我有同样的问题(虽然在不同的情况下),并且激怒了看msdn mvp推动每次手工重建的想法 - Jaguar
是否有可能只针对特定的解决方案? - batmaci


确保您已在Configuration Manager中选择了用于构建的启动项目:

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


4
2018-01-03 19:44





在VS中支持ASM代码并不像.NET / C ++那样具有自动魔力,你需要帮助它。我们使用MAKE文件在VS中编译我们的ASM代码。 MAKE文件定义所有依赖项,以便在下次编译ASM文件时编译INC文件中的更改。

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


1
2018-03-04 04:16





一种可能性是创建一个只执行重建的宏,然后触发调试器。然后将宏映射到一个键。一世 认为 该 _DTE.ExecuteCommand 可以用于此。如果你想要更多地控制调试器,那么 Debugger2 接口有相当多的功能暴露。


1
2018-03-05 13:16





如果VS IDE无法找出依赖关系(因为它无法解析.asm文件并在那里找到INCLUDE指令),那么与MASM一起工作的一个强力解决方案就是重建项目甚至解决方案: MASM非常非常快:我有一些非常大的MASM项目,几十个.asm模块甚至更多包括:最大的这样的项目在很短的几秒内重建。

警告:Kludge前方。 定义一个触发所有.asm文件的预构建会自动强制重建...

  1. 右键单击您的项目 属性(左栏,解决方案 探险家)
  2. 转到配置属性/ 构建事件/预构建事件
  3. 在“命令行”中,键入“touch” * .asm“(确保您在路径中有触摸工具)

现在,每次构建时,所有* .asm文件都将被触摸(即显示已修改)并因此重新编译。而且你不必再记得你必须重建所有,因为无论如何都会发生这种情况。我警告说这是一个kludge,不是吗?此外,IDE将告诉您在编辑器外修改了文件,是否要重新加载它们。你可以说是的!


0
2018-03-05 12:32



首先保存不能解决问题 - 我的设置已经是这样了。目前我在每次运行之前都在使用重建,但我不想那样做。 - Cam
你是否考虑在预建步骤中运行“touch * .asm”?不好,但你至少不必考虑调用不寻常的重建键序列...... - filofel
你可以对此进行扩展吗? - Cam
花了我一些时间,但我想在回答之前检查并测试:1)右键单击您的项目属性(左栏,解决方案资源管理器2)转到配置属性/构建事件/预构建事件3)在“命令行”中,键入“touch * .asm”(确保您在路径中有触摸实用程序)每次构建时,所有* .asm文件都将被触摸(即显示已修改)并因此重新编译。而且你不必再记得你必须重建所有,因为无论如何都会发生这种情况。我说这是一个kludge,不是吗?此外,IDE可能会要求您重新加载文件。 :) - filofel