2010-03-04 42 views
11

编辑:基本上我需要的是让Visual Studio在打开调试时始终重建所有内容。强制视觉工作室在调试时总是“重建所有”


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

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

如果我有一个文件(比如说,与功能的文件)这样

Include functions.inc 

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

我找不到项目属性下的任何选项来解决此问题。不过,我确定它与链接器选项或某事有关 - 如果我在项目属性下进行任何更改(即使我更改了某些内容并将其更改回来,然后按确定),它会在新版本的functions.inc。

任何想法?

+4

尝试编辑自定义构建规则并将* .inc添加到其他依赖项。最终的回退是Build + Rebuild。 – 2010-03-04 04:40:24

+0

重建是我现在使用的。有点讨厌,但我做了ctrl + r的映射,所以它非常快。我会尝试额外的依赖关系的想法,并回传它是否工作。 – Cam 2010-03-04 23:47:49

+0

也看到这个答案 http://stackoverflow.com/questions/1334774/how-do-i-force-a-rebuild-when-the-project-configuration-changes – userSteve 2016-01-20 12:51:56

回答

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的变化,因此将努力在所有的解决方案一旦设置

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 
+0

哈哈,我不能相信这一点。六个月后,我终于找到了答案!非常感谢:) – Cam 2010-08-31 14:54:22

+3

因为我一直在寻找解决方案,所以我遇到了同样的问题(尽管在不同的场景中),并且很激动地看到msdn mvp提倡每次手动重建的想法 – Jaguar 2010-09-01 06:42:22

+0

只有特定的解决方案才有可能吗? – batmaci 2015-09-11 15:56:49

1

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

可以用MSBuild创建一个类似的构建脚本,但我们从来没有花时间做这件事。

0

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

警告:Kludge前方。 定义预生成,做触摸到你.ASM文件将自动强制重建...

  1. 右键单击您的项目 属性(左列,解决 探险家),
  2. 转至配置属性/ 生成事件/预生成事件
  3. 在“命令行”中输入“触摸 * .ASM”(确保你在路径上的触控工具)

现在,每次构建时,都会触及所有* .asm文件(即出现修改)并重新编译。而且你不必再记得你必须重建所有的东西,因为无论如何都会发生这种情况。我警告说这是一个混乱,不是吗?另外,IDE会告诉你你的文件是在编辑器外部修改的,你是否想重新加载它们。你可以说是!

+0

先保存并不能解决问题 - 我的设置已经是这样了。 目前我在每次运行前都使用重建,但我不想那样做。 – Cam 2010-03-05 15:19:49

+0

你是否考虑在预建步骤中运行“touch * .asm”?不好,但你至少不必考虑调用不寻常的重建键序列... – filofel 2010-03-06 15:36:06

+0

你可以扩展到所有? – Cam 2010-03-07 05:59:03

1

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

4

确保,您所选择的启动项目建设在Configuration Manager:

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