【问题标题】:Force visual studio to always 'rebuild all' when debugging强制 Visual Studio 在调试时始终“全部重建”
【发布时间】:2011-01-23 12:35:39
【问题描述】:

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


我目前正在使用 Visual Studio 编译我的汇编程序,使用 MASM,总的来说它工作正常。

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

如果我包含这样的文件(例如,具有函数的文件)

Include functions.inc

并编译它,它原本可以正常工作。但是,如果我随后更改functions.inc 的内容,则无法识别,编译器会跳过functions.inc 并使用我更改之前的旧版本。

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

有什么想法吗?

【问题讨论】:

  • 尝试编辑自定义构建规则并将 *.inc 添加到 Additional Dependencies。最终的后备方案是构建 + 重建。
  • 重建是我现在正在使用的。有点烦人,但我确实将 ctrl+r 映射到它,所以它非常快。我将尝试其他依赖项的想法,然后回复它是否有效。
  • VS2015 怎么可能?

标签: visual-studio visual-studio-2010 assembly compilation masm


【解决方案1】:

您可以通过 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

【讨论】:

  • 哈哈,我不敢相信。 六个月后,我终于有了答案!非常感谢:)
  • 嘿,我遇到了它,因为我自己也在寻找解决方案,我遇到了同样的问题(虽然在不同的情况下),并且很生气看到 msdn mvp 提倡每个人都手动重建的想法并且每次
  • 是否只有特定的解决方案?
【解决方案2】:

确保您已在配置管理器中选择了构建的启动项目:

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

【讨论】:

    【解决方案3】:

    在 VS 中对 ASM 代码的支持并不像 .NET/C++ 那样自动神奇,您必须对其有所帮助。我们使用 MAKE 文件在 VS 中编译我们的 ASM 代码。 MAKE 文件定义了所有的依赖关系,以便在下次编译 ASM 文件时编译 INC 文件中的更改。

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

    【讨论】:

      【解决方案4】:

      一种可能是创建一个宏来简单地重新构建,然后启动调试器。然后将宏映射到一个键。我认为 _DTE.ExecuteCommand 可以用于此目的。如果您想对调试器进行更多控制,Debugger2 接口已经暴露了相当多的功能。

      【讨论】:

        【解决方案5】:

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

        警告:Kludge 向前走。 定义一个对所有 .asm 文件都有影响的预构建会自动强制重新构建...

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

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

        【讨论】:

        • 先保存并不能解决问题——我的设置已经这样了。目前我在每次运行它之前都在使用重建,但我不想这样做。
        • 您是否考虑在预构建步骤中运行“touch *.asm”?不好,但您至少不必考虑调用不寻常的重建键序列...
        • 你能扩展一下吗?
        • 花了我一些时间,但我想在回答之前检查和测试:1)右键单击您的项目属性(左栏,解决方案资源管理器 2)转到配置属性/构建事件/预构建事件 3) 在“命令行”中,键入“touch *.asm”(确保路径中有一个 touch 实用程序)每次构建时,所有 *.asm 文件都会被触动(即出现修改)并因此重新编译。而且您不必再记住必须重建所有内容,因为无论如何这都会发生。我说那是杂牌,不是吗?此外,IDE 可能会要求您重新加载文件。 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多