TL; DR: Существует ли универсальное решение для известной проблемы режима разработки в Windows Forms?
Дизайн форм Windows Forms в значительной степени опирается на визуальный конструктор, который затем генерируетправильный код инициализации (в отличие, скажем, от WPF, где макет окна разработан декларативно). Проблема в том, что часть кода не должна запускаться, если окно или элемент управления находятся в режиме разработки (скажем, загрузка данных из базы данных).
Есть несколько известных решений этой проблемы, но все работаеттолько частично:
Component.DesignMode
- работает только на элементах управления верхнего уровня (не работает в элементе управления, размещенном на элементе управления) и вообще не работает в конструкторах (где на самом деле этобольше всего нужно) LicenseManager.UsageMode == LicenseUsageMode.Designtime
- в свою очередь работает только в конструкторах (поэтому не будет работать - скажем, - в OnPaint
метод - Проверка текущего процесса
devenv.exe
- что такое, давайте будем честными, более болезненный обходной путь, чем твердый, детерминированный, рабочий метод
Мне было интересно, есть ли способ детерминированной и повторяемой проверки, находится ли элемент управления или форма в режиме отладки?
Единственное решение, с которым я пришел, - это создать конкретную конфигурацию только для режима разработки, установить переменную компиляции и использовать условную компиляцию:
public MyForm()
{
InitializeComponent();
#ifndef Design
...
#endif
}
Проблемы:
- Это необходимо переключить вручную
Если вы забудете переключить конфигурацию обратно на Debug или Release, половина приложения, вероятно, перестанет работать. Однако это можно решить, быстро остановив сборку в методе Main:
static void Main()
{
#ifdef Design
#error Exit design configuration first!
#endif
}
Ссылки:
- http://dotnetfacts.blogspot.com/2009/01/identifying-run-time-and-design-mode.html