2009-08-27 13 views
18

¿Hay alguna manera de detectar si su programa se cargó a través de Visual Studio o si se inició como un ejecutable independiente?Detectando si Visual Studio ejecutó un programa, en lugar de ejecutarlo desde el Explorador de Windows

Nuestro software tiene una función de notificación de errores para manejar excepciones no controladas: debemos poder distribuir compilaciones de depuración para nuestros probadores beta, pero no queremos que el informe de errores se active cuando estamos en medio de desarrollo, porque las Excepciones son mucho más útiles si VS las captura con un seguimiento de pila completo, etc.

Ahora, estoy deshabilitando el informe de error si Application.ExecutablePath incluye bin \ Debug o bin \ Release, pero me imagino es probable que haya una forma más robusta de detectar si el programa se cargó a través de VS.

Obviamente, podríamos configurar una compilación diferente con algunas macros de preprocesador, pero por el bien de la pregunta, supongamos que no es una posibilidad - No me importa agregar código, pero estoy tratando de hacer la menor cantidad de modificaciones al proceso de compilación, por lo que las opciones de línea de comandos también son un último recurso.

Si es importante, estoy usando VS2003/.NET 1.1.

Respuesta

40

Si usted está haciendo esto para determinar si está en cualquier depurador (aclarado por @JaredPar), puede utilizar Debugger.IsAttached en el manejador de excepciones.

try 
{ 
    // ... 
} 
catch(Exception ex) 
{ 
    if (!Debugger.IsAttached) 
    { 
     ExceptionHandler.Frob(ex); 
    } 
    else 
    { 
     throw; 
    } 
} 

alternativa:

public static void Frob(Exception ex) 
{ 
    if (Debugger.IsAttached) 
    { 
     Debugger.Break(); 
    } 
} 
+1

Ese es precisamente uno de esos "No sé lo que hago" Estoy buscando, pero lo sabré cuando lo vea "tipo de respuestas, perfecto, ¡gracias! –

+1

System.Diagnostics tiene mucha bondad jugosa. – user7116

+2

Una cosa de la que hay que tener cuidado es que esto dirá si hay un depurador conectado, no si se adjunta Visual Studio. Adjuntar WinDbg causaría el mismo comportamiento. – JaredPar

1

No desarrollo .net, pero en Java lo he hecho pasando una bandera en las opciones de inicio de la aplicación. Entonces, podría pasar una bandera de depuración a la aplicación desde el IDE, y luego verificar que, cuando la aplicación se ejecute como un ejecutable, la bandera no esté presente. Me sorprendería si .net no tuviera algo similar.

+0

Estoy tratando de evitar modificar el proceso de compilación/ejecución tanto como sea posible, pero sí, también puedes leer las opciones de línea de comandos en .NET –

2

¿Ha considerado los argumentos de línea de comandos? Ejecute el programa desde Visual Studio con un indicador --no-exception-handling (o lo que suene apropiado), y no maneje excepciones si ese argumento se transfiere. Cuando inicie el programa en otro lugar, sin este argumento, comportarse normalmente

0

En vez de seguimiento por el árbol de procesos, añadiría una bandera de configuración que permite la función de informes. La bandera siempre puede establecerse en "true" a menos que esté en su entorno DEV y luego lo configure en "false".

Cuestiones relacionadas