Править: В основном то, в чем я нуждаюсь, - чтобы Visual Studio всегда восстанавливала все, когда я поразил отладку.
Я в настоящее время использую Visual Studio для компиляции моих программ сборки, с помощью MASM, и в целом это хорошо работает.
Однако я столкнулся с раздражающей проблемой:
Если я включаю файл (скажите, файл с функциями) как это
Include functions.inc
и скомпилируйте его, это первоначально хорошо работает. Однако, если я тогда изменяю содержание functions.inc, это не распознано, и компиляторы перескакивает через functions.inc и использует старую версию до, я изменил его.
Я не могу найти, что опция где угодно под свойствами проекта фиксирует это. Однако я уверен, что это имеет некоторое отношение к опциям компоновщика или чему-то - если я вношу какие-либо изменения под свойствами проекта (даже если я изменяю что-то и возвращаю его и затем нажимаю OK), это действительно компилирует правильно с новой версией functions.inc.
Какие-либо идеи?
. Вы можете изменить поведение с помощью макроса 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
Поддержка кода ASM в VS не такая автоматическая магия, как .NET / C ++, и вам нужно немного помочь. Мы используем файл MAKE для компиляции нашего кода ASM в VS. Файл MAKE определяет все зависимости, поэтому изменения в файлах INC будут скомпилированы при следующей компиляции файла ASM.
Аналогичный сценарий сборки можно создать с помощью MSBuild, но мы никогда не уделяли этому времени.
Одним из вариантов может быть создание макроса, который просто делает rebuild all, а затем запускает отладчик. Затем привязать макрос к клавише. Я думаю, что для этого можно использовать _DTE.ExecuteCommand. А если вам нужно еще больше контроля над отладчиком, то интерфейс Debugger2 имеет довольно много функциональных возможностей.
Если дело в том, что VS IDE не может разобраться с зависимостями (потому что не может разобрать .asm файл и найти в нем директивы INCLUDE), то одно решение, которое очень хорошо работает с MASM - это пересборка проекта или даже решения: MASM очень, очень быстр: У меня есть несколько очень больших MASM проектов, несколько десятков .asm модулей и еще больше include: Самый большой такой проект перестраивается за (очень) несколько секунд.
Предупреждение: Впереди Kludge в квадрате. Определение предварительной сборки, которая делает касание всех ваших .asm файлов, автоматически заставит вас перестроиться...
Теперь при каждой сборке все *.asm файлы будут затронуты (т.е. окажутся измененными) и таким образом перекомпилированы. И вам больше не придется помнить, что нужно перекомпилировать все файлы, так как это произойдет в любом случае. Я ведь предупреждал, что это не совсем корректно, не так ли? Кроме того, IDE сообщит вам, что ваши файлы были изменены вне редактора и хотите ли вы их перезагрузить. Вы можете ответить "да"!