36

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

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

現在、このシナリオを確認するために次のようなものを使用しています。

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

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

4

3 に答える 3

68

試す:System.Diagnostics.Debugger.IsAttached

于 2008-09-19T13:29:53.800 に答える
19

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

if( IsDebuggerPresent() )
{
    ...
}

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

于 2008-09-19T13:43:15.313 に答える
5

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

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

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

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

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

これにより、これらの厄介な AccessViolationExceptions が発生するのを防ぎ、それによって、私が悲しみを引き起こすことがわかっているものをうっかり実行しようとした場合に、アプリケーションが致命的にクラッシュすることを防ぎます。

于 2012-08-24T03:47:49.833 に答える