Как определить, что код C# Windows Forms выполняется в Visual Studio?

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

9 ответов

Решение

Попробуйте свойство 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;
        }
    }
}

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

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

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

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

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

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

#if DEBUG
#endif

тоже

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

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;
    }
}

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

public static bool InVisualStudio() {
  return StringComparer.OrdinalIgnoreCase.Equals(
    "devenv", 
    Process.CurrentProcess.ProcessName);
}

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

protected static bool IsInDesigner
{
    get { return (Assembly.GetEntryAssembly() == null); }
}

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

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

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

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

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

Я хочу добавить к этому, что в Visual Studio 2022 с .Net 6 процесс, который фактически открывает конструкторы winforms, называется DesignToolsServer. По моему опыту, DesignMode работает вне конструктора, а проверка ProcessName = "DesignToolsServer" работает внутри конструктора.

Другие вопросы по тегам