自作プログラムで任意のテキストファイルを画面から編集したいとか、ランチャー代わりにブラウザやEXCELなどの外部プログラム(アプリケーション)を起動したりなど、その機能を一から作ると大変なので、外部プログラムを呼び出して済ませたい場合があります。
そこで、今回はC#から外部プログラムを呼び出す方法について紹介します。
単に解説だけではなく、用途別に具体的なサンプルコードも用意していますので、必要な部分をコピペしてすぐにお使いいただけます。
外部プログラムを実行する方法
外部プログラムを呼び出すには、System.Diagnostics 名前空間にある Process クラスを使います。
使う場合はプログラムの冒頭に次の1行を追加してください。
1 |
using System.Diagnostics; |
Process クラスは 静的なクラスであるため、new せずに使うことが出来ます。
そして、ProcessクラスのStartメソッドを使うと任意のプログラムを呼び出すことができます。
以降の説明では、「引数」と「パラメータ」という用語を使いますが、「引数」はメソッドを呼び出す際に渡す値のことで、パラメータは外部プログラムの呼び出し時に、外部プログラムに対して渡す値のことを指しています。
単純にプログラムを呼び出すには
外部プログラムを単に呼び出すだけなら、Process.Startの引数にファイル名を指定するだけです。
例えば、電卓(calc.exe) を呼び出したいなら、次のように記述します。
1 |
Process.Start("calc"); |
呼び出す際にパラメータを指定することも可能です。
例えば、メモ帳(notepad.exe) に abc.txt というファイルを開かせたい場合は、次のように記述します。
1 |
Process.Start("notepad","abc.txt"); |
任意のファイルやフォルダを開くには
任意のファイルを開く場合は、プログラムの代わりにファイルやフォルダを指定します。
1 2 3 4 5 |
//証明写真.jpg を表示する場合 Process.Start("証明写真.jpg"); //Program Files のフォルダを開く場合 Process.Start(@"C:\Program Files"); |
ファイルを指定した場合、ファイルの種類に応じてWindowsの規定プログラムが呼び出されます。
よって、拡張子が pdf ならAcrobatReaderが、mp4 なら Windows メディアプレーヤーが自動的に起動され、指定したファイルの内容が表示されます。
DOSコマンドを実行するには
DOSコマンドを実行する場合、実行プログラムは "cmd" を指定し、そのパラメータとして実行したいDOSコマンドを指定します。
また、DOSコマンドの直前には "/c "を付けてください。
例えば、DIRコマンドを使って、Dドライブにあるファイルをサブディレクトごと一覧表示したい場合、"DIR D:\ /s" というコマンドを実行する必要があります。
これをProcess.Startで呼び出す場合は次のようになります。
1 |
Process.Start("cmd",@"/c dir d:\ /s"); |
DIRコマンドの実行結果をファイルに保存する場合、リダイレクト > を使うことで簡単に保存できます。
例えば、上記の実行結果を Dドライブ直下の result.txt に保存する場合は、次のようになります。
1 |
Process.Start("cmd",@"/c dir d:\ /s > d:\result.txt"); |
実行したプログラム(DOSコマンド)から値を受け取るには
実行したプログラムが標準出力に結果を出力する場合に限り、ProcessStartInfo クラスのオブジェクトを Process.Start に渡すことで、結果を受け取ることができます。
一般的に電卓、メモ帳、エクセル、ワードなどのアプリケーションから結果を受け取ることは、ほとんどないと思いますので、ここではDOSコマンドに限定して解説します。
DOSコマンド(=コンソールアプリケーション)は、標準出力に結果を返すように作ることが多いと思います。
このようなコンソールアプリケーションから結果を受け取る場合は、次のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//ProcessStartInfoのオブジェクトを生成 ProcessStartInfo psInfo = new ProcessStartInfo(); psInfo.FileName = "cmd" //コマンド psInfo.Arguments = @"/c dir d:\ /s"; //引数 psInfo.CreateNoWindow = true; // コンソール・ウィンドウを開かない psInfo.UseShellExecute = false; // シェル機能を使用しない psInfo.RedirectStandardOutput = true; // 標準出力をリダイレクト Process p = Process.Start(psInfo); // コマンドの実行開始 string line = ""; while ((line = p.StandardOutput.ReadLine()) != null) { ~処理~ } |
少し長くなりましたが、CreateNoWindow、UseShellExecute、RedirectStandardOutput の3つのプロパティに値を設定することで、コマンドプロンプトの画面を開かず、裏で処理を実行し、その結果を受け取ることができるようになります。
実際に結果を受け取るのは StandardOutput.ReadLine() であり、戻り値が null になるまでループを繰り返すことで、全ての結果を受け取ることが出来ます。
外部プログラムに対して操作を行う方法
ProcessStart.Start メソッドを実行すると、Processオブジェクトが返されます。
このProcessオブジェクトを使うことで、呼び出した外部プログラムの処理時間を取得したり、終了するまで待機したり、強制終了させることが可能です。
プログラムの開始、終了、処理時間を取得するには
開始時刻は StartTime、終了時刻は ExitTime、処理時間は TotalProcessorTime で取得できます。
型 | プロパティ名 | 記述例 |
---|---|---|
DateTime | StartTime | StartTime.ToString("yyyy/MM/dd HH:mm:ss.fff") ⇒"2021/05/01 15:00:16.994" |
DateTime | ExitTime | ExitTime.ToString("yyyy/MM/dd HH:mm:ss.fff") ⇒"2021/05/01 15:00:16.994" |
TimeSpan | TotalProcessorTime | TotalProcessorTime.ToString() ⇒"00:00:00.2656250" |
プログラムの終了コードを受け取るには
外部プログラムが終了時に終了コードを出力していた場合、ExitCodeプロパティを参照することで、値が取得できます。
1 2 |
Process p = Process.Start("notepad"); int code = p.ExitCode; |
プログラムが終了するまで待機するには
Process.Start で実行した外部プログラムは非同期で動作します。
外部プログラムが終了するまで呼び出し側で待ちたい場合は、WaitForExit メソッドを使います。
1 2 |
Process p = Process.Start("notepad"); p.WatiForExit(); |
プログラムを強制終了するには
呼び出した外部プログラムを、呼び出し側から強制終了するには、Kill メソッドを使います。
下記はメモ帳を起動し、5秒後に強制終了するサンプルです。
1 2 3 |
Process p = Process.Start("notepad"); System.Threading.Thread.Sleep(5000); p.Kill(); |
まとめ
今回は Process.Start を使って、
- 任意のプログラムを起動する方法
- ファイルやフォルダを開く方法
- DOSプログラムを起動して結果を受け取る方法
- Process.Startから返されるProcessオブジェクトを使った処理時間や処理の待機、強制終了方法
について解説致しました。
特にDOSコマンド(=コンソールアプリケーション)とのやり取りは、DOSコマンドという既存の機能を手軽に利用できるため、結構重宝します。
皆さんのプログラム開発に役立てていただければ幸いです。