11

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


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

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

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

Include functions.inc

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

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

有任何想法吗?

4

5 回答 5

8

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

更新 上述解决方案有效,但是它有一些关于内容文件的缺陷,即使调试器正在运行,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
于 2010-08-31T10:02:33.713 回答
6

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

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

于 2011-01-03T19:44:52.547 回答
1

一种可能性可能是创建一个简单地重新构建所有然后触发调试器的宏。然后将宏映射到一个键。我认为_DTE.ExecuteCommand可以用于此。如果您想对调试器进行更多控制,Debugger2接口会公开很多功能。

于 2010-03-05T13:16:47.250 回答
1

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

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

于 2010-03-04T04:16:18.797 回答
0

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

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

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

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

于 2010-03-05T12:32:56.710 回答