Как определить, что код C # Windows Forms выполняется в Visual Studio? - PullRequest
43 голосов
/ 11 марта 2010

Существует ли переменная или константа препроцессора, позволяющая узнать, что код выполняется в контексте Visual Studio?

Ответы [ 8 ]

61 голосов
/ 11 марта 2010

Попробуйте Debugger.IsAttached или DesignMode свойство или получить ProcessName или соответствующая комбинация

Debugger.IsAttached // or                                       
LicenseUsageMode.Designtime // or 
System.Diagnostics.Process.GetCurrentProcess().ProcessName

Вот образец

public static class DesignTimeHelper {
    public static bool IsInDesignMode {
        get {
            bool isInDesignMode = LicenseManager.UsageMode == LicenseUsageMode.Designtime || Debugger.IsAttached == true;

            if (!isInDesignMode) {
                using (var process = Process.GetCurrentProcess()) {
                    return process.ProcessName.ToLowerInvariant().Contains("devenv");
                }
            }

            return isInDesignMode;
        }
    }
}
17 голосов
/ 11 марта 2010

Свойство DesignMode не всегда точное. Мы использовали этот метод, чтобы он работал последовательно:

    protected new bool DesignMode
    {
        get
        {
            if (base.DesignMode)
                return true;

            return LicenseManager.UsageMode == LicenseUsageMode.Designtime;
        }
    }

Контекст вашего звонка важен. У нас DesignMode возвращал false в IDE, если выполнялся в событии при определенных обстоятельствах.

6 голосов
/ 11 марта 2010

Существует свойство DesignMode для компонентов. Это удобно, когда вы используете Design Viewer VS.

Но когда вы говорите об отладке в Visual Studio, вам нужно использовать свойство Debugger.IsAttached. Затем вы можете использовать

#if DEBUG
#endif

тоже

4 голосов
/ 18 декабря 2015

Я использую этот метод расширения:

internal static class ControlExtension
{
    public static bool IsInDesignMode(this Control control)
    {
        while (control != null)
        {
            if (control.Site != null && control.Site.DesignMode)
                return true;
            control = control.Parent;
        }
        return false;
    }
}
3 голосов
/ 11 марта 2010

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

public static bool InVisualStudio() {
  return StringComparer.OrdinalIgnoreCase.Equals(
    "devenv", 
    Process.CurrentProcess.ProcessName);
}
2 голосов
/ 11 января 2014

Вы можете использовать это:

protected static bool IsInDesigner
{
    get { return (Assembly.GetEntryAssembly() == null); }
}
2 голосов
/ 11 марта 2010

Есть свойство DesignMode, которое вы можете проверить, но по моему опыту оно не всегда точное. Вы также можете проверить, является ли исполняемый файл DevEnv.exe

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

1 голос
/ 11 марта 2010

Я использую этот код, чтобы определить, работает ли он в Visual Studio или развернут на клиентах.

if (ApplicationDeployment.IsNetworkDeployed) {
    // do stuff 
} else {
   // do stuff (within Visual Studio)
}

Прекрасно работает для меня целую вечность. Я пропускаю некоторую логику, когда внутри Visual Studio (например, вход в приложение и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...