Можно ли редактировать и продолжить в Visual Studio 2010 без приостановки выполнения?
Недавно я посмотрел немного живой эфир Нотча 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 ответов
Обновление: этот ответ теперь доступен в виде видео.
Я изо всех сил пытался найти способ сделать это. Я знаю, что это не отвечает на ваш точный вопрос. Но на самом деле вы ищете рабочий процесс, в котором вы можете вносить изменения в код с нулевой (или почти нулевой) задержкой, и я думаю, что я понял, что самое близкое, что вы можете получить с помощью только Visual Studio. (И поэтому избегать огромных инженерных усилий и иметь дело с "ненормальными" проектами).
Способ достижения этого рабочего процесса на самом деле удивительно прост, если подумать:
Используйте сочетания клавиш!
Первый способ, который я придумал, это просто использовать обычный метод редактирования и продолжения установки точки останова. Только с помощью клавиатуры вы можете сделать это значительно быстрее. Это работает только с кодом, вызываемым в цикле (например, draw / update). Щелкните по коду, который вы хотите изменить, добавьте точку останова (F9), точка останова будет почти сразу достигнута, измените код, удалите точку останова (F9), а затем снова запустите код (F5).
Это довольно хорошо. Вам не нужно использовать мышь, чтобы поразить относительно маленькую цель "Добавить точку останова" в левом столбце. Но он перемещает фокус ввода в начало строки, поэтому обычно вам нужно снова использовать мышь, чтобы исправить это, прежде чем вы сможете начать редактирование.
Я хочу что-то быстрее. Поэтому я нашел лучшее решение:
Снова, используя клавиатуру: нажмите Ctrl + Alt + Break, чтобы "Break All". Это входит в отладчик практически мгновенно, не беспокоясь об установке точки останова или о том, что код, который вы хотите изменить, выполняется в цикле. Это изменит окно редактора и поместит фокус на документ, где прервано выполнение, но вы можете сразу же исправить это, нажав Ctrl + - для "Навигация в обратном направлении".
Затем вы можете внести изменения и просто нажать F5, чтобы увидеть их в действии. Вы должны использовать мышь только один раз (или не использовать ее вообще), чтобы сначала выбрать, где вы хотите начать печатать - как вы и ожидали.
По общему признанию, Ctrl + Alt + Break и Ctrl + - ужасные комбинации клавиш для того, что вы хотите сделать очень быстро. И было бы лучше, если бы была нажата только одна клавиша.
Если у вас есть полная Visual Studio, вы можете превратить ее в макрос или надстройку. У Express их нет - поэтому лучшее, что вы можете сделать, это изменить привязки клавиш (Инструменты, Настроить, Клавиатура...) и связать их с двумя смежными клавишами, которые вы можете нажимать по очереди. Или используйте утилиту внешнего макроса.
Лично я настроил две комбинации клавиш, которые будут нажиматься последовательно (вам, кажется, не требуется задержка между ними) с помощью макроса, установленного на запасную кнопку на моей мыши. Который работает достаточно хорошо - я обычно выбираю текст одновременно. Я мог бы добавить макрос клавиатуры позже.
До сих пор я выявил две незначительные ловушки этого метода:
- Когда вы снова запустите приложение, Visual Studio придаст ему фокус. Было бы неплохо, если бы это сохраняло фокус. Добавление щелчка левой кнопкой мыши к моему макросу является частичным решением для быстрого повторного редактирования кода.
- "Навигация в обратном направлении" не сохраняет выделенный текст, только позицию каретки.
Я могу сказать вам как, но вам это не понравится:
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: они делают то, что я упомянул для вас)
Это может быть не совсем то, что вы ищете, но это то, что я делал. Просто добавьте точку останова во время игры. Как только он остановится, вы можете редактировать вещи, удалить точку останова, а затем нажать F5, чтобы продолжить.
По большей части, это позволяет вам редактировать вещи во время игры и продолжать запускать игру позже, но это не работает для всего. Вы не можете добавлять или удалять вещи уровня класса, а также не можете добавлять / удалять целые функции или параметры. В основном я делаю это, чтобы проверить разные числа и уравнения для более мелких вещей, которые попадают в каждое обновление.
Чтобы ответить на оригинальный вопрос "в Visual Studio 2010 без приостановки выполнения?"
Нет. Для Java есть JRebel, который позволяет это.
Я могу быстро представить, почему Microsoft не сделала этого - если у вас есть какой-то комитет или группа людей, разрабатывающих вещи - даже одному человеку легко придумать веские аргументы, когда это "динамическое обновление программного обеспечения"/hotswap прекратится. Это просто слишком легко сбить. Или, если они продолжат это, это будет через какую-то совершенно новую "корпоративную среду", которая требует много шагов, работы и понимания, чтобы добраться куда угодно, потому что они хотят использовать это для сложных онлайн-сценариев.
Я бы предпочел, чтобы был какой-то простой способ сделать это - я рискну и выложу множество заявлений об отказе от ответственности, что если вам нужны сервисы горячей замены, которые общаются с внешними системами, то вам нужно использовать эту сложную среду или что-то подобное.
Наиболее типичным сценарием, в котором это можно безопасно использовать с низким риском, является создание прототипа и настройка какого-либо двигателя с высокой стоимостью запуска или с большей вероятностью для изучения поведения, если что-то работает в двигателе (например, правила), глючит и демонстрирует ошибку, многое должно произойти, и возможно, вы не всегда сталкиваетесь с ошибкой. Это тот случай, когда это может сэкономить недели отладки, по крайней мере, в моем случае.
Я привык работать в Java, используя IntelliJ Idea + DCEVM (Динамическая Виртуальная Эволюция кода).
К сожалению, я не нашел ничего ближе к этой конфигурации на платформе Microsoft C#. Это действительно отстой, и вы ничего не можете с этим поделать. Вы можете использовать некоторые пользовательские макросы, но вы не можете многое сделать в режиме редактирования и продолжения без перезапуска сеанса отладки).
Однако, если вы можете, попробуйте использовать новейшее ядро .NET, которое предлагает гораздо лучшую производительность с помощью Dotnet Watch. Все еще не так быстро, как DCEVM, но намного лучше, чем традиционный опыт горячей перезагрузки VS + .NET. Подробности здесь.