web-dev-qa-db-ja.com

System.Diagnostics.Process UseShellExecuteは正確に何をしますか?

Xcopyの呼び出しを(とりわけ)実行するMSBuildタスクがあります。私が見つけたのは、このxcopyの呼び出しは、バッチファイルからMSBuildタスクを実行すると正しく実行され、同じバッチファイルが別のファイルから呼び出されたときに何が起こっているのかを理解できる出力を実行または生成できないことです。 System.Diagnostics.Processを使用したC#アプリケーション。

両方のプロセスは、ほぼ同じ構造で起動されます。

waitProc.StartInfo.Arguments = "/C [executable]";
waitProc.StartInfo.FileName = "cmd.exe";
waitProc.StartInfo.UseShellExecute = false;

さらに、xcopyコマンドで「UseShellExecute」をfalseからtrueに変更することで、両方のユースケースでこれを成功させることができますが、コマンドは3番目のユースケースでは実行できません。 3番目のユースケースは、msbuildを直接呼び出すWindowsサービスである自動ビルドシステムです。ビルドマシンで障害が発生した場合、copyコマンドが無期限にハングします。これは、System.Diagnostics.Processがウィンドウを表示しようとし、サービスにWindowsデスクトップセッションが関連付けられていないため、できないためです。表示ウィンドウ。

「CreateNoWindow」プロパティを使用してみました。「WindowStyle」を「ProcessWindowStyle.Hidden」に設定しようとしましたが、ビルドマシンの動作は変わりません。

とはいえ、私が本当に知りたいのは、UseShellExecuteプロパティが正確に何をするかということです。これは、MSDNドキュメントが示唆するよりもはるかに多くのことを行うように思われるためです。

ありがとう。

25
Beanz

ProcessStartInfo.UseShellExecute は、指定されたアプリケーションを実行するためにWindowsシェルを使用するようにプロセスに指示します。

このセットがないと、EXEファイルを直接実行することしかできません。これを設定することにより、Windowsシェルの使用を許可します。これにより、.docファイルを指定したり、関連するプログラムにファイルを開かせたりすることができます。

ただし、Windowsシェルを使用するには、有効なデスクトップコンテキストが必要です。そのため、3番目のユースケースは失敗します。

一般に、Windowsシェルを使用していない限り、cmd.exeの使用には問題があります。 「バッチ」操作を直接処理するコードを記述したい場合があります。つまり、 System.IO名前空間 の型のメソッドを使用してコピーを実行します。これにより、この問題を完全に回避できます。

28
Reed Copsey

ドキュメント から:

このプロパティをfalseに設定すると、入力、出力、およびエラーストリームをリダイレクトできます。

注:UserNameプロパティがnull参照(Visual BasicではNothing)または空の文字列でない場合、UseShellExecuteはfalseである必要があります。そうでない場合、Process.Start(ProcessStartInfo)メソッドが呼び出されたときにInvalidOperationExceptionがスローされます。オペレーティングシステムのシェルを使用してプロセスを開始すると、任意のドキュメント(デフォルトのオープンアクションを持つ実行可能ファイルに関連付けられた登録済みファイルタイプ)を開始し、プロセスコンポーネントを使用してファイルに対して印刷などの操作を実行できます。 UseShellExecuteがfalseの場合、Processコンポーネントで実行可能ファイルのみを開始できます。

注:ErrorDialogプロパティをtrueに設定する場合、UseShellExecuteはtrueである必要があります。 UseShellExecuteがtrueの場合とUseShellExecuteがfalseの場合では、WorkingDirectoryプロパティの動作が異なります。 UseShellExecuteがtrueの場合、WorkingDirectoryプロパティは実行可能ファイルの場所を指定します。 WorkingDirectoryが空の文字列の場合、現在のディレクトリには実行可能ファイルが含まれていると見なされます。

UseShellExecuteがfalseの場合、WorkingDirectoryプロパティは実行可能ファイルの検索には使用されません。代わりに、開始されたプロセスによって使用され、新しいプロセスのコンテキスト内でのみ意味があります。

1
Nick

'UseShellExecute' IIRCの使用は、エクスプローラー(メインシェル)が.NETランタイムではなくプロセスを実行できるようにすることです....誰かが私を間違っていると訂正しない限り...

0
t0mm13b

workingDirectoryを正しく指定しましたか? >c:\log.txt 2>c:\err.txtを追加すると、コマンドの実際の出力を確認できます。この追加で実行し、それらのファイルを確認してください。

0
Andrey