Принудительная визуальная студия всегда "перестраивает все" при отладке

Изменить: В основном мне нужна визуальная студия, которая всегда восстанавливает все, когда я удаляю debug.


В настоящее время я использую визуальную студию для компиляции моих программ сборки, используя MASM, и в целом она отлично работает.

Однако я столкнулся с раздражающей проблемой:

Если я включаю файл (скажем, файл с функциями), такой как

Include functions.inc

и скомпилируйте его, он изначально отлично работает. Однако, если я затем изменяю содержимое функций .inc, это не распознается, и компиляторы пропускают функции functions.inc и используют старую версию, прежде чем я ее изменил.

Я не могу найти вариант где-либо в свойствах проекта, чтобы исправить это. Однако я уверен, что это имеет какое-то отношение к параметрам компоновщика или чем-то - если я вношу какие-либо изменения в свойства проекта (даже если я что-то изменил и изменил его, а затем нажмите ОК), он правильно скомпилируется с новой версией functions.inc.

Любые идеи?

Ответ 1

Вы можете изменить поведение с помощью макроса EnvironmentEvents в Visual Studio Macro Explorer:

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

Ответ 2

Убедитесь, что вы выбрали проект запуска для сборки в Configuration Manager:

Build → Configuration Manager → отметьте столбец "Build" для всех соответствующих проектов.

Ответ 3

Поддержка ASM-кода в VS не так автоактивна, как .NET/С++, и вам нужно немного помочь. Мы используем файл MAKE для компиляции нашего ASM-кода в VS. Файл MAKE определяет все зависимости, чтобы изменения в файлах INC были скомпилированы при следующем компиляции файла ASM.

Аналогичная сборка script может быть создана с помощью MSBuild, но мы никогда не тратили время на это.

Ответ 4

Одной из возможностей может быть создание макроса, который просто восстанавливает все, а затем запускает отладчик. Затем сопоставьте макрос с ключом. Я думаю, что для этого можно использовать _DTE.ExecuteCommand. И если вам нужен еще больший контроль над отладчиком, интерфейс Debugger2 имеет довольно много функциональности.

Ответ 5

Если это связано с тем, что VS IDE не может определить зависимости (потому что он не может проанализировать файл .asm и найти там директивы INCLUDE), одно решение грубой силы, которое отлично работает с MASM, - это перестройте проект или даже решение: MASM очень, очень быстро: у меня есть очень большие проекты MASM, несколько десятков модулей .asm и еще больше включает в себя: Самый большой такой проект перестраивается в течение (очень) нескольких секунд.

Предупреждение: Kludge в квадрате впереди. Определение предварительной сборки, которая делает прикосновение ко всем вам .asm файлам, автоматически заставляет rebuild...

  • Щелкните правой кнопкой мыши на своем проекте свойства (левая колонка, решение Проводник),
  • Перейдите в раздел Свойства конфигурации/ Событие сборки/событие предварительной сборки
  • В командной строке введите "touch" *.asm "(убедитесь, что у вас есть утилита touch на пути)

Теперь каждый раз, когда вы строите, все *.asm файлы будут затронуты (т.е. появятся модифицированными) и, таким образом, будут перекомпилированы. И вам больше не нужно будет помнить, что вам нужно перестроить всех, поскольку это все равно произойдет. Я предупреждал, что это был клоч, не так ли? Кроме того, IDE сообщит вам, что ваши файлы были изменены вне редактора, и вы хотите перезагрузить их. Вы можете сказать "да".