Можно ли редактировать и продолжать в Visual Studio 2010 без приостановки выполнения?

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

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

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


person zfedoran    schedule 20.12.2011    source источник
comment
Могу ли я предложить прочитать значения, которые вы хотите отредактировать, из файла, чтобы вы могли редактировать файл и перечитывать его, когда захотите, во время работы?   -  person Benjamin    schedule 24.12.2011
comment
Да, это хорошая практика, но возможность интерактивного программирования тоже хороша. Обычно это делается с помощью языка сценариев. Я надеялся, что C# сможет сделать то же, что и Java в данном случае. К сожалению, похоже, что кто-то принял конструктивное решение заблокировать исходные файлы в режиме только для чтения во время выполнения, не задумываясь о том, как может быть полезно разрешить редактирование.   -  person zfedoran    schedule 26.12.2011


Ответы (5)


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


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

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

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

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

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

Мне нужно что-то более быстрое. Поэтому я придумал лучшее решение:

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

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

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

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

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

На данный момент я выявил две небольшие ловушки этого метода:

  • При повторном запуске приложения Visual Studio передает ему фокус. Было бы неплохо, если бы он сохранял фокус. Добавление щелчка левой кнопкой мыши к моему макросу — частичное решение для быстрого повторного редактирования кода.
  • «Перейти назад» не сохраняет выделение текста, а только позицию курсора.
person Andrew Russell    schedule 17.04.2012
comment
Я надеюсь, что этот рабочий процесс станет проще в будущих версиях Visual Studio. Похоже, растет интерес к немедленной обратной связи и функциям горячей замены. В этом выступлении показано, что однажды станет возможным: vimeo.com/36579366 - person zfedoran; 18.04.2012
comment
Только что наткнулся на это. Спасибо за этот замечательный ответ, Андрей! - person Austin Brunkhorst; 27.02.2013

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

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

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

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

... и вот здесь все становится сложнее...

3a) game.exe должен ссылаться на modified.dll. НЕ .vcproj, настоящая dll

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

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

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

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

  • вы можете вызвать msbuild.exe для перестроения modified.dll, когда вы нажмете «волшебную клавишу»
  • вы можете использовать dll компилятора CSharp для динамической перекомпиляции каждого класса, а не всей модифицируемой.dll

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

person JasonS    schedule 26.12.2011
comment
Спасибо, что нашли время найти решение :) - person zfedoran; 26.12.2011

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

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

person Steve    schedule 02.03.2012

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

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

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

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

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

person Anonymous Coward    schedule 02.05.2015

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

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

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

person lukyer    schedule 23.02.2017