Можно ли редактировать и продолжить в Visual Studio 2010 без приостановки выполнения? - PullRequest
14 голосов
/ 21 декабря 2011

Я недавно посмотрел немного живой эфир Нотча Ludum Dare.Он широко использует функцию «горячей» замены «Затмения» во время работы над своей игрой.(Вот видео того, что я имею в виду http://www.twitch.tv/notch/b/302823358?t=86m30s)

Я хотел бы сделать то же самое с C # и XNA. К счастью, Visual Studio имеет функцию «Редактировать и продолжить». Однако я хотел бы редактироватьмой код рендеринга во время его выполнения вместо его приостановки.

Могу ли я настроить Visual Studio на то же самое? Я заметил, что есть флажок для Break all processes when one process breaks. Возможно ли установитьмой цикл рендеринга в другом потоке, чтобы игра продолжала рендеринг, пока я вносил изменения?

Ответы [ 5 ]

16 голосов
/ 17 апреля 2012

Обновление: Этот ответ теперь доступен как видео .


Я изо всех сил пытался найти способ сделать это. Я знаю, что это не отвечает на ваш точный вопрос. Но на самом деле вы ищете рабочий процесс, в котором вы можете вносить изменения в код с нулевой (или почти нулевой) задержкой, и я думаю, что я понял, что самое близкое, что вы можете получить с помощью только Visual Studio. (И, следовательно, избегая огромных инженерных усилий и имея дело с «ненормальными» проектами).

Способ достижения этого рабочего процесса на самом деле удивительно прост, если подумать:

Используйте сочетания клавиш!

Первый способ, который я придумал, это просто использовать обычный метод редактирования и продолжения установки точки останова. Только с помощью клавиатуры вы можете сделать это значительно быстрее. Это работает только с кодом, вызываемым в цикле (например, draw / update). Щелкните по коду, который вы хотите изменить, добавьте точку останова ( F9 ), точка останова будет почти немедленно нажата, измените код, удалите точку останова ( F9 ), а затем запустите Снова код ( F5 ).

Это довольно хорошо. Вам не нужно использовать мышь, чтобы поразить относительно маленькую цель «Добавить точку останова» в левом столбце. Но он перемещает фокус ввода в начало строки, поэтому вам обычно приходится снова использовать мышь, чтобы исправить это, прежде чем вы сможете начать редактирование.

Я хочу что-то быстрее. Поэтому я нашел лучшее решение:

Снова с помощью клавиатуры: нажмите Ctrl + Alt + Break для «Break All». Это входит в отладчик практически мгновенно, не беспокоясь о настройке точки останова или о том, что код, который вы хотите изменить, выполняется в цикле. Это изменит окно редактора и поместит фокус на документ, в котором выполнение прервано, но вы можете сразу же исправить его, нажав Ctrl + - для «Навигация в обратном направлении».

Затем вы можете внести изменения и просто нажать F5 , чтобы увидеть их в действии. Вы должны использовать мышь только один раз (или не использовать ее вообще), чтобы сначала выбрать, где вы хотите начать печатать - как вы и ожидали.

По общему признанию Ctrl + Alt + Break и Ctrl + - ужасно сочетания клавиш для того, что вы хотите сделать очень быстро. И было бы лучше, если бы была нажата только одна клавиша.

Если у вас есть полная Visual Studio, вы, вероятно, можете превратить ее в макрос или надстройку. У Express их нет - поэтому лучшее, что вы можете сделать, это изменить привязки клавиш (Инструменты, Настроить, Клавиатура ...) и связать их с двумя смежными клавишами, которые вы можете нажимать по очереди. Или используйте утилиту внешнего макроса.

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

Пока что я обнаружил две незначительные ловушки этого метода:

  • Когда вы снова запустите приложение, Visual Studio придаст ему фокус. Было бы неплохо, если бы это сохраняло фокус. Добавление щелчка левой кнопкой мыши к моему макросу является частичным решением для быстрого повторного редактирования кода.
  • «Навигация в обратном направлении» не сохраняет выделенный текст, только позицию каретки.
7 голосов
/ 26 декабря 2011

я могу сказать вам как, но вам это не понравится:

1) запустить исполняемый файл игры в экземпляре Visual Studio ( game.exe -> vsInstanceA)

2) закодируйте ваш модифицируемый код в отдельном dll, используя отдельный экземпляр Visual Studio ( modifiable.dll -> vsInstanceB)

* обратите внимание, что это позволяет вам скомпилировать modifiable.dll , таким образом выполняя проверку ошибок времени компиляции и т. Д. *

... и вот где это сложно ...

3a) game.exe должен ссылаться на modifiable.dll . НЕ .vcproj, фактическая DLL

3b) когда вы нажимаете «волшебный ключ» ( game.exe ищите нажатие клавиши), game.exe выгружают modifiable.dll и перезагрузите его. Вы можете легко сделать это с помощью классов Assembly и AppDomain, предоставляемых в mscorlib. Конечно, это означает, что вам нужно выгрузить все зависимые системы в game.exe .

обратите внимание, в этом разделе 3b) много размахиваний руками, это довольно много работы, но довольно прямолинейно (пример поиска в Google: https://www.google.com/search?q=dynamic+load+dll+.net)

... и после этого вы можете идти ...

3-alt) другие варианты, если 3b) вам не подходит:

  • Вы можете вызвать msbuild.exe для восстановления modifiable.dll при нажатии "магический ключ"
  • Вы можете использовать DLL компилятора CSharp для динамического перекомпилируйте каждый класс вместо всего modifiable.dll

но, к сожалению, в мои более чем 10-летние разработки .net, это единственный путь, если кто-то не создал для этого сторонний продукт (IE: они делают то, что я упомянул для вас)

2 голосов
/ 02 марта 2012

Это может быть не совсем то, что вы ищете, но это то, что я делал.Просто добавьте точку останова во время игры.Как только он остановлен, вы можете редактировать вещи, удалять точку останова, а затем нажимать F5 для продолжения.

В большинстве случаев это позволяет вам редактировать вещи во время игры и продолжать запускать игру позже, ноэто не работает для всего.Вы не можете добавлять или удалять вещи уровня класса, а также не можете добавлять / удалять целые функции или параметры.В основном я делаю это, чтобы проверить различные числа и уравнения для более мелких вещей, которые попадают в каждое обновление.

0 голосов
/ 23 февраля 2017

Я привык работать на Java, используя IntelliJ Idea + DCEVM (Динамическая ВМ эволюции кода).

К сожалению, я не нашел ничего подходящего к этой конфигурации на платформе Microsoft C #.Это действительно отстой, и вы ничего не можете с этим поделать.Вы можете использовать некоторые пользовательские макросы, но вы все равно не сможете многое сделать в режиме Редактировать и продолжить без перезапуска сеанса отладки).

Однако, если можете, попробуйте использоватьновейшее ядро ​​.NET, которое предлагает гораздо лучшую производительность с помощью Dotnet Watch. Все еще не так быстро, как DCEVM, но намного лучше, чем традиционный опыт горячей перезагрузки VS + .NET. Подробности здесь .

0 голосов
/ 02 мая 2015

Чтобы ответить на оригинальный вопрос «в Visual Studio 2010 без приостановки выполнения?»

Нет.Для Java есть JRebel, который позволяет это.

Я могу быстро представить, почему Microsoft не сделала этого - если у вас есть какой-то комитет или группа людей, разрабатывающих вещи - даже одному человеку легко придумать веские аргументы, когда происходит такое «динамическое обновление программного обеспечения»."/ hotswap сломается.Это просто слишком легко сбить.Или, если они продолжат это, это будет через какую-то совершенно новую «корпоративную среду», которая требует много шагов, работы и понимания, чтобы добраться куда угодно, потому что они хотят использовать это для сложных онлайн-сценариев.

I 'Я предпочел бы, чтобы был какой-то простой способ сделать это - я рискну и приведу множество заявлений об отказе от ответственности, что если вы хотите использовать службы горячей замены, которые взаимодействуют с внешними системами, то вам нужно использовать эту сложную среду или что-то подобное.

Наиболее типичным сценарием, где это можно безопасно использовать с низким риском, является создание прототипа и настройка какого-либо двигателя с высокой стоимостью запуска или с большей вероятностью для изучения поведения, если что-то работает в двигателе (например, правила), глючит иВыявите ошибку, многое должно произойти, и возможно, вы не всегда сталкиваетесь с ошибкой.Это тот случай, когда это может сэкономить недели отладки, по крайней мере, в моем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...