Visual studio 强制visual studio始终';重建所有';调试时

Visual studio 强制visual studio始终';重建所有';调试时,visual-studio,visual-studio-2010,assembly,compilation,masm,Visual Studio,Visual Studio 2010,Assembly,Compilation,Masm,编辑:基本上我需要的是VisualStudio在我点击调试时总是重新生成所有文件 我目前正在使用VisualStudio编译我的汇编程序,使用MASM,总体来说,它运行良好 然而,我遇到了一个恼人的问题: 如果我包括这样一个文件(比如,一个带有函数的文件) Include functions.inc 并编译它,它最初运行良好。但是,如果我随后更改functions.inc的内容,这将无法识别,编译器将跳过functions.inc并使用我更改之前的旧版本 我在“项目属性”下的任何位置都找不到

编辑:基本上我需要的是VisualStudio在我点击调试时总是重新生成所有文件


我目前正在使用VisualStudio编译我的汇编程序,使用MASM,总体来说,它运行良好

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

如果我包括这样一个文件(比如,一个带有函数的文件)

Include functions.inc
并编译它,它最初运行良好。但是,如果我随后更改functions.inc的内容,这将无法识别,编译器将跳过functions.inc并使用我更改之前的旧版本

我在“项目属性”下的任何位置都找不到修复此问题的选项。不过,我确信它与链接器选项或其他内容有关-如果我在项目属性下进行任何更改(即使我更改了某些内容并将其更改回原处,然后按“确定”),它确实可以使用functions.inc的新版本正确编译


有什么想法吗?

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


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

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

警告:前方有乱码。 定义一个对所有.asm文件都有影响的预构建将自动强制重新生成

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

  • 现在,每次构建时,所有*.asm文件都将被触摸(即显示为已修改)并重新编译。你将不再需要记住你必须重建所有的东西,因为不管怎样这都会发生。我警告过这是一个混乱,不是吗?此外,IDE会告诉您您的文件已在编辑器外部修改,是否要重新加载它们。你可以说是的

    一种可能是创建一个宏,该宏只需执行“全部重建”,然后启动调试器。然后将宏映射到一个键。我想这是可以用的。如果您想要对调试器进行更多的控制,则该界面会公开相当多的功能。

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

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


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

    尝试编辑自定义生成规则并将*.inc添加到其他依赖项中。最终的退路是构建+重建。重建是我现在正在使用的。有点烦人,但我确实将ctrl+r映射到了它,所以速度非常快。我将尝试“附加依赖项”的想法,然后再发帖说明它是否有效。另外,请参阅以下答案:VS2015如何实现这一点?先保存并不能解决问题-我的设置已经是这样了。目前我在每次运行它之前都使用了所有的重建,但是我不想这么做。你是否考虑过在预构建步骤中运行一个“触摸*.ASM”?不太好,但您至少不必考虑调用不寻常的重建键序列……您能详细介绍一下吗?我花了一些时间,但我想在回答之前检查和测试:1)右键单击项目属性(左列,解决方案资源管理器2)转到中的配置属性/生成事件/预生成事件3)“命令行”,键入“touch*.asm”(确保路径中有touch实用程序),每次生成时,都会触摸所有*.asm文件(即显示已修改)这样重新编译。你就不必再记得你必须重新编译所有的文件了,因为不管怎样,这都会发生。我说这是一个乱七八糟的问题,不是吗?此外,IDE可能会要求你重新加载文件。:)哈哈,我真不敢相信。六个月后我终于有了答案!非常感谢:)嘿,我是因为我自己也在寻找解决方案,但我也遇到了同样的问题(虽然是在不同的场景中),看到msdn mvp每次都在推广手工重建的想法,我非常气愤。是否只有一个特定的解决方案才有可能?