プロセスを開始するために2つの異なる方法を試しました。
最初の
定義は、Startメソッドのパラメーターとして定義されます。
System.Diagnostics.Process.Start("Excel", string.Format("\"{0}\"", ExcelFileBox.Text.ToString()));
私の考え:
これは問題なく始まりますが、フィードバックを得る方法がわかりません。
2番目
Excelが正常に起動したかどうかを知りたいので、ProcessStartInfo
を調べ始めました。たとえば、Excelはユーザーのマシンに存在する可能性が非常に高いですが、保証はなく、指示するのはばかげています正常に起動しなかったユーザー。
System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo
{
FileName = "Excel",
Arguments = string.Format("\"{0}\"", ExcelFileBox.Text.ToString()),
ErrorDialog = true,
UseShellExecute = false,
WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
};
try
{
System.Diagnostics.Process.Start(startinfo);
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
私の考え:
これにより、「指定されたファイルが見つかりません」というエラーが発生しますが、それがExcelアプリケーションなのか私のファイルなのかは不明です。いずれにせよ、私はエラーメッセージの能力に感謝しますが、現時点では受け取るべきではありません。
これが成功したかどうかを知る方法についての考え、提案、アイデア?
解決済み
プロセスを開始する最初の方法をtry-catchに入れましたが、これは見事に機能します。
Process.Start() のMSDNページには、このメソッドには戻り値が意味するブール型のオーバーロードがあることが記載されています。
プロセスリソースが開始されている場合はtrue。新しいプロセスリソースが開始されない場合(たとえば、既存のプロセスが再利用される場合)はfalse。
さらに、次の3つの例外をスローできます。
ProcessコンポーネントのStartInfoにファイル名が指定されていません。
-または-
ProcessStartInfo.RedirectStandardInput、ProcessStartInfo.RedirectStandardOutput、またはProcessStartInfo.RedirectStandardErrorがtrueの場合、StartInfoプロパティのProcessStartInfo.UseShellExecuteメンバーはtrueです。
関連ファイルを開く際にエラーが発生しました。
プロセスオブジェクトは既に破棄されています。
Process.Start()のこのオーバーロード(メソッドの唯一の非静的オーバーロード)を使用するには、ProcessStartInfoオブジェクトを使用してProcessクラスのインスタンスを作成する必要があります。
以下に例を示します。
ProcessStartInfo processStartInfo = new ProcessStartInfo("Excel.EXE");
Process process = new Process();
process.StartInfo = processStartInfo;
if (!process.Start())
{
// That didn't work
}
ただし、これでもまだスローされる可能性があるので、静的な.Start()メソッド呼び出しの1つにキャッチをラップする方がおそらく良いでしょう。
それを考えると、Process.Start()の呼び出しが機能するかどうかは明らかであり、0(またはスローされている例外)の戻り値からこれを判断できます。
プロセスが開始されると、HasExitedなどのProcessクラスのプロパティを使用して、プロセスの状態を確認できるようになり、物事を多く制御できます。
要するに、ユーザーのマシンにExcelがない場合、Process.Start()は例外をスローします。
Process.ExitCode
のプロパティ0
(success)value。
Process.Start()は、既存のプロセスを取得したか、新しいプロセスが開始されたかを知らせるブール値も返します。
さらに、プロセスのProcessIdをチェックして、プロセスが開始/実行中であることを確認できます。何かのようなもの:
bool started = False;
Process p = new Process();
p.StartInfo = YourStartInfo;
started = p.Start();
try {
int procId = p.Id;
}
catch(InvalidOperationException){
started = False
}
catch(Exception ex) {
started = False
}
プロセスが実際に開始したかどうかを正確に判断するために、プロセスIDを見つけようとしました。プロセスIDが見つかった場合、キャッチを入力してデバッグステートメントを出力するプロセスIDが見つからなかった場合は続行します。
try
{
bool pathExists = File.Exists(module.ExecutionPath);
if (pathExists)
{
ProcessStartInfo startArgs = new ProcessStartInfo();
startArgs.FileName = "C:\Windows\System32\notepad.exe";
startArgs.Arguments = null;
Process process = new Process();
process.StartInfo = startArgs;
process.Start();
Process startedProcess = CheckIfProcessStarted(process);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message + " " + ex.InnerException);
Debug.WriteLine("Couldnt find the process so it never ran");
}
private Process CheckIfProcessStarted(Process process)
{
return Process.GetProcessById(process.Id);
}