Есть ли способ * полностью * отключить «Редактировать и продолжить»?

Мне было интересно, есть ли способ полностью заблокировать мой код при его отладке в Visual Studio 2008. Документы кода автоматически блокируются при запуске в качестве 64-битных приложений, что я очень предпочитаю; тем не менее, я пишу большую часть своего кода, создавая надстройки для 32-разрядной версии Excel. В результате, хотя я нацелен на AnyCPU, хост VS знает, что он работает в 32-битном процессе, и, следовательно, исходный код не заблокирован, пока код выполняется в Visual. Студия.

Я могу отключить «Редактировать и продолжить», выбрав «Инструменты»> «Параметры»> «Отладка»> «Изменить и продолжить», а затем сняв флажок «Разрешить редактирование и продолжить». Однако это не полностью блокирует код. Это предотвращает выполнение каких-либо изменений в коде при текущем запуске, но не препятствует действительному изменению кода щелчками мыши или нажатиями клавиш.

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

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

  2. Многие из моих автоматических тестов управляют пользовательским интерфейсом через SendKeys. Однако, проходя такой тест с помощью отладчика, я иногда могу забыть, что некоторые аспекты связаны с SendKeys, что означает, что нажатия клавиш в конечном итоге отправляются в Visual Studio IDE вместо Excel.

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

У кого-нибудь есть идеи здесь? Можно ли полностью заблокировать код при запуске, размещенном в Visual Studio, при компиляции на 32-разрядном процессоре?

Некоторые связанные сообщения по этой проблеме, но ни один из них напрямую не касается этого:

Заранее благодарим за любую помощь или идеи ...

Майк


person Mike Rosenblum    schedule 12.01.2010    source источник
comment
Обратите внимание, что модульный тест, который взаимодействует с внешним программным обеспечением, называется интеграционным тестом.   -  person Lasse V. Karlsen    schedule 16.01.2010
comment
@Lasse: Хорошо, достаточно честно. Я отредактирую приведенное выше, чтобы сказать, что это автоматические тесты, поскольку я запускаю набор тестов, варьирующихся от отдельных модульных тестов до интеграционных тестов. Спасибо. Однако здесь это не имеет большого значения - проблема заключается в SendKeys, независимо от того, какой тест вы хотите ее рассматривать.   -  person Mike Rosenblum    schedule 17.01.2010


Ответы (3)


Вот лучшее, что я мог придумать. Это работает, но есть некоторые шаги, которые вы можете не предпринимать.

По сути, методика состоит в том, чтобы установить для файлов вашего проекта режим «Только чтение» при запуске приложения, а затем снова сделать их доступными для записи после завершения вашего приложения.

Однако в VS2k8 по умолчанию настройка файла только для чтения позволяет редактировать файл. Вам необходимо сначала отключить параметр «Разрешить редактирование файлов только для чтения ...» в Инструменты> Параметры> Среда> Документы.

Во-вторых, вам нужно добавить в реестр следующий ключ как DWORD и установить для него значение 1:

HKCU\Sofware\Microsoft\Visual Studio\9.0\Source Control\UncontrolledInMemoryEditDialogSuppressed  

Этот по-прежнему не будет работать полностью. Затем вам нужно установить для этого проекта в системе управления исходным кодом значение Visual Source Safe. (‹- этот шаг, как я полагаю, вам не понравится.)

Затем перезапустите VS2k8.

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

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

Сложнее сделать их снова доступными для записи после завершения работы вашего приложения. Самым простым решением, вероятно, является ярлык для командного файла.

person CleverPatrick    schedule 16.01.2010
comment
+1 Ух ты, очень впечатляюще. Я ищу что-то более чистое и простое, но кажется, что потребуется какой-то взлом или макрос. Если никто не предложит ничего проще, я поставлю вам галочку, но позволю этому продолжаться еще несколько дней, чтобы посмотреть, сможет ли кто-нибудь добиться большего. (Между прочим, будет ли это чище или проще сделать в VS 2010? Пожалуйста, не прилагайте никаких усилий для исследования этого, но если вы знаете это из головы.) - person Mike Rosenblum; 17.01.2010
comment
Похоже, плохая идея - возиться с битами, доступными только для чтения, за спиной поставщика управления версиями. - person Josh; 20.01.2010
comment
Похоже, плохая идея - возиться с битами, доступными только для чтения, за спиной поставщика управления версиями. Это хороший аргумент, Джош. И требование использовать Visual Source Safe также определенно является проблемой. Думаю, мне придется отказаться от своего обещания "Умному человеку" поставить здесь галочку ... Я думаю, что этот вопрос действительно остается нерешенным. :-( :-( - person Mike Rosenblum; 21.01.2010
comment
Умный человек: Есть ли простой способ временно отключить редактирование кода для выбранных документов и / или всех документов в VS2005 или других версиях? Иногда я случайно ввожу что-то в свой код, когда хочу открыть другое окно. (Думаю) еще лучше: есть ли способ предотвратить получение документов в фокусе «по умолчанию» или через точку останова, в отличие от преднамеренных действий? - person supercat; 05.10.2010

Вот трюк, который я использую в Visual Studio 2005 (у меня нет возможности протестировать в Visual Studio 2008, но он должен работать):

  • Откройте свойства исполняемой сборки
  • Перейдите на вкладку Отладка.
  • Установите флажок Включить отладку неуправляемого кода.

Документы кода должны оставаться заблокированными даже при достижении точки останова, и любая попытка изменить ее должна вызывать всплывающее окно с сообщением «Изменения не разрешены, если включена неуправляемая отладка».

person Laurent Etiemble    schedule 18.01.2010
comment
Лоран, это звучит ОЧЕНЬ многообещающе ... но для меня это не работает при компиляции с x86. К сожалению, поведение не меняется. Нужно ли мне где-то добавлять некоторые «небезопасные» операции, чтобы вызвать эффект блокировки? - person Mike Rosenblum; 18.01.2010
comment
В Инструменты ›Параметры› Отладка ›Общие, у вас есть Прервать все процессы, когда один процесс прерывается. проверил? Я постараюсь провести несколько тестов с Visual Studio 2008 и буду держать вас в курсе. - person Laurent Etiemble; 19.01.2010
comment
Привет, Лоран, да, флажок «Разбить все процессы при сбое одного процесса» установлен. Спасибо за приложенные усилия (на самом деле, +1 за усилия, я очень ценю это). - person Mike Rosenblum; 19.01.2010
comment
Вот еще одно указание: вы можете включить / отключить поведение «Изменить и продолжить» для сборки, используя атрибут DebuggableAttribute на уровне модуля. Его свойство DebuggingFlags позволяет указать, можно ли использовать Edit и Continue. Этот флаг автоматически добавляется компилятором в режиме отладки. Не знаю, может ли это сработать для вас ... - person Laurent Etiemble; 21.01.2010
comment
Привет, Лоран, я ценю усилия, но я уже могу включить или выключить «Изменить и продолжить» глобально, и это не блокирует код при компиляции против процессора x86, поэтому я не вижу, как установить это для любой данной сборки человек может помочь ... :-( - person Mike Rosenblum; 22.01.2010

Привет - извините, я не могу помочь вам с полной блокировкой вашего кода - у меня противоположное желание: полностью РАЗБЛОКИРОВАТЬ его во время отладки, но я могу помочь вам с вашей второй проблемой.

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

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

Удачи!

Адам

person Adam G. Carstensen    schedule 12.01.2010
comment
+1 Очень хорошая идея Адам. Я обязательно воспользуюсь какой-нибудь версией этого. Как вы знаете, я не могу поставить вам отметку об этом, но это действительно хорошая помощь. Спасибо! (Похоже, мне придется начать вознаграждение в надежде решить основные проблемы ... Я начинаю думать, что этого не может быть.) - person Mike Rosenblum; 15.01.2010
comment
Я хотел бы знать, удалось ли вам сделать код полностью редактируемым и как это сделать. - person Roman Starkov; 03.06.2010