Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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


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

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

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

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

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

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

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

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

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

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

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

До сих пор я идентифицировал две незначительные ошибки этого метода:

  • При повторном запуске приложения Visual Studio фокусируется. Было бы неплохо, если бы он сосредоточился. Добавление левого щелчка мыши на мой макрос является частичным решением для быстрого повторного редактирования кода.
  • "Перемещение назад" не сохраняет выбор текста, только положение каретки.

Ответ 2

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

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

2) закодируйте свой модифицируемый код в отдельной dll, используя отдельный экземпляр визуальной студии (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 search: https://www.google.com/search?q=dynamic+load+dll+.net)

... и после этого вы хорошо пойдете...

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Ответ 5

Я привык работать на Java, используя IntelliJ Idea + DCEVM (Dynamic code evolution VM).

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

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