2010-03-11 13 views
39

¿Hay una variable o una constante de preprocesador que permita saber que el código se ejecuta dentro del contexto de Visual Studio?¿Cómo detectar que el código de C# Windows Forms se ejecuta dentro de Visual Studio?

+0

¿Quieres esta información para saber si su código se está depurando? Si es así, hay una macro que le dice si hay un depurador conectado a su aplicación, consulte: http://stackoverflow.com/questions/2188201/is-there-a-way-to-detect-if-a-debugger-is -incorporado-a-un-proceso-de-c –

+0

En C# puede usar: http://stackoverflow.com/questions/361077/c-clr-remote-debugger-how-to-wait-until-attached –

Respuesta

56

Trate Debugger.IsAttached o DesignMode propiedad o conseguir ProcessName o una combinación, según el caso

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

Aquí es una sample

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

+1 para Debugger.IsAttached –

+6

No olvides la loca pérdida de memoria en Process.GetCurrentProcess() recuerda desechar – Neil

+0

En mi código, he agregado una variable bool estática para saber cuándo se llamó IsInDesignMode y otra para mantener el resultado de la función.Al comienzo de la función, devuelvo el resultado de la primera llamada. Con esto, el interior de la función es solo llamada una vez en tiempo de diseño y una vez en tiempo de ejecución. No veo ningún conflicto donde el tiempo de diseño se fusione con el tiempo de ejecución y esto es mucho más rápido cuando tiene una gran cantidad de llamadas a esta función. – Samuel

1

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

Tome look here. Podría hacer que esta pregunta sea una dupla, pero todo depende de lo que intentes lograr.

6

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 utilizar la propiedad Debugger.IsAttached. A continuación, puede utilizar

#if DEBUG 
#endif 

demasiado

+0

+ 1 para Debugger.IsAttached –

3

Creo que la forma más sencilla y fiable para determinar si la extensión se ejecuta en el diseñador de Windows Forms es comprobar el proceso actual.

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

que utiliza este código para distinguir si se está ejecutando en Visual Studio o si está implementado para los clientes.

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

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

+0

¿No supone eso [ClickOnce] (http://en.wikipedia.org/wiki/ClickOnce) (disfrazado en Visual Studio como "Publicar")? ¿Funcionaría si un proyecto de instalación se utiliza para producir un instalador [MSI] ordinario (http://en.wikipedia.org/wiki/Windows_Installer)? –

15

La propiedad DesignMode no siempre es precisa. Hemos utilizado este método para que funcione de manera coherente:

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

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

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

1

Puede utilizar esta:

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

utilizo 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; 
    } 
} 
Cuestiones relacionadas