web-dev-qa-db-ja.com

VisualStudioデバッグセッション内からアプリケーションが開始されたかどうかを確認します

システム全体のキーボードフックをインストールするアプリケーションに取り組んでいます。 Visual Studio内からデバッグビルドを実行しているときにこのフックをインストールしたくありません(そうしないと、スタジオと最終的にはシステムがハングします)。DEBUGシンボルが定義されているかどうかを確認することで、これを回避できます。

ただし、アプリケーションのreleaseバージョンをデバッグするときに、同じ問題を回避するために、Visual Studio内から開始されたことを検出する方法はありますか?リリースビルドに取り組んでいたからといって、スタジオ/コンピューターを再起動する必要があり、デバッグビルドに戻すのを忘れたデバッガーを使用していくつかのバグを修正したいのは非常に面倒です。

現在、私はこのシナリオをチェックするために次のようなものを使用しています。

System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
string moduleName = currentProcess.MainModule.ModuleName;
bool launchedFromStudio = moduleName.Contains(".vshost");

これを「ブルートフォースウェイ」と呼びます。これは私の設定で機能しますが、このシナリオを検出する別の(より良い)方法があるかどうかを知りたいと思います。

36
Grimtron
63
TraumaPony

Windows APIを使用している場合は、次を使用してデバッガーが存在するかどうかを確認できる関数があります。

if( IsDebuggerPresent() )
{
    ...
}

参照: http://msdn.Microsoft.com/en-us/library/ms680345.aspx

16
William Casarin

現在のプロセスのモジュール名に文字列「.vshost」が含まれているかどうかをテストすることは、アプリケーションがVSIDE内から実行されているかどうかを判断するための最良の方法です。

System.Diagnostics.Debugger.IsAttachedプロパティを使用することもできますが、VS IDEを介してEXEを実行しているかどうかを区別することはできませんRunコマンド、またはデバッグビルドを直接実行している場合(たとえば、Windowsエクスプローラーまたはショートカットを使用)、VSIDEを使用してそれに接続します。

(COM関連)データ実行防止エラーでを実行する必要がある問題が発生したことがあります。 VSで生成されたEXEで/ NXCOMPAT:NOパラメーターを指定してeditbin.exeを実行するビルド後イベント

F5を押してプログラムを実行しただけで、何らかの理由でEXEが変更されなかったため、AccessViolationExceptions VS内から実行すると、DEP違反のコードで発生しますIDE-デバッグが非常に困難になりました。ただし、生成されたEXEをショートカットで実行すると、次に、VS IDEデバッガーを接続し、AccessViolationExceptionsが発生することなくコードをテストできました。

これで、VS IDE内から毎日プログラミングGrindを実行している場合に、特定のコードの実行について警告またはブロックするために使用できる「vshost」メソッドを使用する関数を作成しました。

これにより、これらの厄介なAccessViolationExceptionsが発生し、不注意で悲しみを引き起こすことがわかっている何かを実行しようとすると、アプリケーションが致命的にクラッシュするのを防ぐことができます。

5
TonyT