Как сказать, выполняется ли код.NET разработчиком Visual Studio

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

Как я могу определить во времени выполнения, если код выполняется как часть разработчика, открывающего форму?

55
задан Peter Mortensen 18 August 2012 в 22:34
поделиться

11 ответов

Чтобы узнать, находитесь ли Вы в "режиме проектирования":

  • компоненты Windows Forms (и средства управления) имеют свойство DesignMode.
  • средства управления Windows Presentation Foundation должны использовать , IsInDesignMode присоединил свойство.
49
ответ дан Roger Lipscombe 26 November 2019 в 17:40
поделиться

Я нашел, что свойство DesignMode было багги, по крайней мере, в предыдущих версиях Visual Studio. Следовательно, я сделал свое собственное использование следующей логики:

Process.GetCurrentProcess().ProcessName.ToLower().Trim() == "devenv";

Своего рода взлом, я знаю, но он работает хорошо.

0
ответ дан Eyvind 26 November 2019 в 17:40
поделиться

Если Вы находитесь в форме или управляете Вами, может использовать свойство DesignMode:

if (DesignMode)
{
        DesignMode Only stuff
}
0
ответ дан Akselsson 26 November 2019 в 17:40
поделиться

Я не уверен при выполнении в количествах режима отладки как реальные, но простой способ состоит в том, чтобы включать if оператор в коде, который проверяет на System.Diagnostics.Debugger.IsAttached.

1
ответ дан Peter Mortensen 26 November 2019 в 17:40
поделиться
System.Diagnostics.Debugger.IsAttached
1
ответ дан Jason Plank 26 November 2019 в 17:40
поделиться
System.ComponentModel.Component.DesignMode == true
1
ответ дан Jason Plank 26 November 2019 в 17:40
поделиться

Вы проверяете DesignMode свойство Вашего управления:

if (!DesignMode)
{
//Do production runtime stuff
}

Примечание, что это не будет работать в Вашем конструкторе, потому что компоненты еще не были инициализированы.

1
ответ дан Jason Plank 26 November 2019 в 17:40
поделиться

Мы используем следующий код в UserControls, и это делает работу. Только Используя DesignMode не будет работать в Вашем приложении, которое использует Ваши пользовательские пользовательские элементы управления, как указано другими участниками.

    public bool IsDesignerHosted
    {
        get { return IsControlDesignerHosted(this); }
    }

    public bool IsControlDesignerHosted(System.Windows.Forms.Control ctrl)
    {
        if (ctrl != null)
        {
            if (ctrl.Site != null)
            {
                if (ctrl.Site.DesignMode == true)
                    return true;
                else
                {
                    if (IsControlDesignerHosted(ctrl.Parent))
                        return true;
                    else
                        return false;
                }
            }
            else
            {
                if (IsControlDesignerHosted(ctrl.Parent))
                    return true;
                else
                    return false;
            }
        }
        else
            return false;
    }
1
ответ дан 26 November 2019 в 17:40
поделиться

Это - выход взлома, но если Вы используете VB.NET и когда Вы выполняете из Visual Studio Мой. Приложение. Развертывание. CurrentDeployment будет Ничем, потому что Вы еще не развернули его. Я не уверен, как проверить эквивалентную стоимость в C#.

2
ответ дан Peter Mortensen 26 November 2019 в 17:40
поделиться

Самый надежный подход:

public bool isInDesignMode
{
    get
    {
        System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess();
        bool res = process.ProcessName == "devenv";
        process.Dispose();
        return res;
    }
}
15
ответ дан zmilojko 26 November 2019 в 17:40
поделиться

Управление. Свойство DesignMode, вероятно, что Вы ищете. Это говорит Вам, если родитель управления открыт в разработчике.

В большинстве случаев это работает отлично, но существуют экземпляры, где это не работает как ожидалось. Во-первых, это не работает в конструкторе средств управления. Во-вторых, DesignMode является ложью для средств управления "внука". Например, DesignMode на средствах управления, размещенных в UserControl, возвратит false, когда UserControl будет размещен в родителе.

существует довольно легкое обходное решение. Это проходит примерно так:

public bool HostedDesignMode
{
  get 
  {
     Control parent = Parent;
     while (parent!=null)
     {
        if(parent.DesignMode) return true;
        parent = parent.Parent;
     }
     return DesignMode;
  }
}

я не протестировал тот код, но он должен работа.

19
ответ дан JohnV 26 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: