Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Попробуйте Debugger.IsAttached или DesignMode или получите Имя_процесса или комбинацию, если необходимо

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

Ответ 2

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

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

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

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

Ответ 3

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

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

#if DEBUG
#endif

слишком

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

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