2009-08-27 4 views
18

Gibt es eine Möglichkeit festzustellen, ob Ihr Programm über Visual Studio geladen wurde oder ob es als eigenständiges Programm gestartet wurde?Erkennen, ob ein Programm von Visual Studio im Gegensatz zu Windows Explorer ausgeführt wurde

Unsere Software verfügt über eine Fehlerberichtsfunktion, um unbehandelte Ausnahmen zu behandeln - wir müssen in der Lage sein, Debug-Builds an unsere Beta-Tester zu verteilen, aber wir wollen nicht, dass der Fehlerbericht ausgelöst wird Entwicklung, weil die Ausnahmen viel nützlicher sind, wenn VS sie mit einer vollen Stapelverfolgung usw. abfängt.

Im Moment deaktiviere ich den Fehlerbericht, wenn Application.ExecutablePath bin \ Debug oder bin \ Release enthält, aber ich denke Es gibt wahrscheinlich einen robusteren Weg festzustellen, ob das Programm über VS geladen wurde.

Natürlich könnten wir einen anderen Build mit einigen Präprozessor-Makros einrichten, aber für die Frage angenommen, dass dies keine Möglichkeit ist - ich habe nichts dagegen, Code hinzuzufügen, aber ich versuche zu machen Die wenigsten Änderungen am Build-Prozess. Daher sind Befehlszeilenoptionen auch ein letzter Ausweg.

Wenn es wichtig ist, verwende ich VS2003/.NET 1.1.

Antwort

40

Wenn Sie dies tun, um zu bestimmen, ob es in jeder Debugger (geklärte von @JaredPar) ist, können Sie Debugger.IsAttached in den Exception-Handler verwenden.

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

Alternativ:

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

Das ist genau einer dieser "Ich weiß nicht, was ich ' Ich suche nach, aber ich werde es wissen, wenn ich es sehe "Art von Antworten - perfekt, danke! –

+1

System.Diagnostics hat viele saftige Güte. – user7116

+2

Eine Sache, vor der man sich hüten sollte, ist, ob ein Debugger angeschlossen ist und nicht, ob Visual Studio angeschlossen ist. Das Anfügen von WinDbg würde das gleiche Verhalten verursachen. – JaredPar

1

Ich mache keine .net Entwicklung, aber in Java habe ich dies getan, indem ich eine Flagge in die Startoptionen der Anwendung übergeben. Sie können also ein Debug-Flag von der IDE an die App übergeben und dann darauf achten, dass das Flag nicht vorhanden ist, wenn die App als ausführbare Datei ausgeführt wird. Ich wäre überrascht, wenn .net etwas ähnliches nicht hätte.

+0

Ich versuche zu vermeiden, den Build/run-Prozess so viel wie möglich zu ändern, aber ja, Sie können Befehlszeilenoptionen auch in .NET lesen :) –

2

Haben Sie Befehlszeilenargumente berücksichtigt? Führen Sie das Programm in Visual Studio mit einem --no-exception-handling-Flag (oder was auch immer sich anhört) aus und behandeln Sie keine Exceptions, wenn dieses Argument übergeben wird. Wenn Sie das Programm an einer anderen Stelle starten, ohne dieses Argument, wird es normal verhalten.

0

Statt Tracking durch Prozessbaum, würde ich eine Konfiguration Flag hinzufügen, die die Reporting-Funktion ermöglicht. Das Flag kann immer auf "true" gesetzt werden, es sei denn, Sie befinden sich in Ihrer DEV-Umgebung, dann setzen Sie es auf "false".

Verwandte Themen