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

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

44
задан Peter Mortensen 20 February 2014 в 23:02
поделиться

6 ответов

Попробуйте свойство 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;
        }
    }
}
62
ответ дан 26 November 2019 в 21:57
поделиться

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

public static bool InVisualStudio() {
  return StringComparer.OrdinalIgnoreCase.Equals(
    "devenv", 
    Process.CurrentProcess.ProcessName);
}
3
ответ дан 26 November 2019 в 21:57
поделиться

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

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

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

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

17
ответ дан 26 November 2019 в 21:57
поделиться

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

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

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

1
ответ дан 26 November 2019 в 21:57
поделиться

Для компонентов есть свойство DesignMode . Это удобно при использовании средства просмотра дизайна VS.

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

#if DEBUG
#endif

6
ответ дан 26 November 2019 в 21:57
поделиться

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

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

2
ответ дан 26 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

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