¿Cómo detectar que el código de C # Windows Forms se ejecuta dentro de Visual Studio?

¿Hay una variable o una constante de preprocesador que permita saber que el código se ejecuta dentro del contexto de Visual Studio?

Pruebe la propiedad Debugger.IsAttached o DesignMode u obtenga ProcessName o una combinación, según corresponda

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

Aquí hay una muestra

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

La propiedad DesignMode no siempre es precisa. Hemos tenido uso de este método para que funcione de manera consistente:

  protected new bool DesignMode { get { if (base.DesignMode) return true; return LicenseManager.UsageMode == LicenseUsageMode.Designtime; } } 

El contexto de tu llamada es importante. Hemos tenido DesignMode return false en el IDE si se está ejecutando en un evento bajo ciertas circunstancias.

Existe la propiedad DesignMode para Componentes. Es útil cuando usa el Visor de diseño de VS.

Pero cuando hablas de depuración en Visual Studio necesitas usar la propiedad Debugger.IsAttached . Entonces, puedes usar

 #if DEBUG #endif 

también

Creo que la manera más simple y confiable de determinar si su extensión se ejecuta en el diseñador de WinForms es verificar el proceso actual.

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

Yo uso este método de extensión:

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

Puedes usar esto:

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

Hay una propiedad DesignMode que puede verificar, pero según mi experiencia, no siempre es precisa. También podría verificar si el ejecutable es DevEnv.exe

Echa un vistazo aquí . Podría hacer que esta pregunta sea una dupla, pero todo depende de lo que intentes lograr.

Uso este código para distinguir si se está ejecutando en Visual Studio o si se implementó para los clientes.

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

Funciona bien para mí por años. Me salteo algo de lógica cuando estoy dentro de Visual Studio (como iniciar sesión en la aplicación, etc.).