C#のプログラムからexe形式の外部プログラムを実行するにはProcessクラスのStartメソッドを用います。ここでは、その方法と実行されたプロセスを取得する方法をお示しします。ここで説明している方法を使えば、例でお示ししているように外部プログラムを起動してその処理時間を計測したりも可能になります。
なお、UWPアプリでProcess.Startメソッドを用いる場合はFullTrustProcessLauncherでランチャープログラムを起動して、ランチャーを上でProcess.Startメソッドを用いる必要があります。
[toc]基本的な実行方法
exeファイル名を指定して実行する
C#のプログラム上から外部のプログラム(exeファイル)を実行する場合はProcessクラスのStartメソッドを用います。
コンソール上からメモ帳を起動するプログラムを作ってみましょう。メモ帳の本体は「C:\Windows\notepad.exe」にあるので、次のようにStartメソッドの引数に指定してみましょう。
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("「Enter」キーを押すと、メモ帳を起動します。");
Console.ReadLine();
Process.Start(@"C:\Windows\notepad.exe");
}
}
なお、メモ帳は単に「notepad」とプログラム名だけ指定しても起動できるので、以下のように表記することもできます。
Process.Start("notepad");
オプション(引数)を指定してexeファイルを実行する
オプションを指定して外部プログラムを実行する場合は、あらかじめ必要なオプションを指定したProcessStartInfoインスタンスを作成して、それをStartメソッドの引数に指定することで実行します。
メモ帳は起動時に引数としてファイル名を指定すればそのファイルを開いてくれるので、ここではコンソール上で指定されたファイル名をメモ帳の引数に渡すプログラムを組んでみましょう。
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("テキストファイルのパスを指定してください");
string path = Console.ReadLine();
ProcessStartInfo processInfo = new ProcessStartInfo
{
FileName = "notepad",
Arguments = path
};
Process.Start(processInfo);
}
}
11-15行目で起動する外部プログラムの名前をFileNameプロパティに、引数名をArgumentsプロパティに設定したProcessStartInfoインスタンスを作成し、16行目でそれをStartメソッドの引数に指定しています。
なお、複数の引数がある場合はArgumentsプロパティに半角スペースで区切って指定するだけで問題ありません。例えば「a」「b」「c」の引数を指定する場合は
Arguments = "a b c";
とします。
ProcessStartInfo型では引数のほかにも、「プロセスを新しいウィンドウで起動するかどうか」「外部プログラム起動時のパスワード」などを指定でき、外部プログラムの起動時の処理を細かく指定することができます。
外部プログラムの実行状態を取得する
外部プログラムのプロセスを取得する
Startメソッドで外部プログラムを実行すると、戻り値として起動された外部プログラムを表すProcess型のインスタンスが返されます。このインスタンスのプロパティにアクセスすることで外部プログラムの状態(開始時刻、終了時刻、終了コードなど)を取得することができます。
例えば外部プログラムの開始時刻(startTime)は次のように取得できます。
Process process = Process.Start(****);
DateTime startTime = process.StartTime;
外部プログラムの終了まで処理を待機する
外部プログラムの処理結果を取得したい場合などは、その外部プログラムの終了まで処理を待機する必要があります。そのような場合は次のようにProcessインスタンスのWaitForExitメソッドを用いましょう。
Process process = Process.Start(****);
process.WaitForExit();
例:外部プログラムの処理時間を計測する
それでは、例として外部プログラムとしてメモ帳を起動して、その実行時間を取得するプロラムを作成してみましょう。
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("「Enter」キーを押すと、メモ帳を起動します。");
Console.ReadLine();
Process process = Process.Start("notepad");
Console.WriteLine(process.StartTime.ToString() + "\tメモ帳を起動しました");
process.WaitForExit();
Console.WriteLine(process.ExitTime.ToString() + "\tメモ帳を終了しました(終了コード:" + process.ExitCode + ")");
TimeSpan executionTime = process.ExitTime - process.StartTime;
Console.WriteLine("処理時間:" + executionTime.ToString());
}
}
11行目でメモ帳を起動し、そのプロセスをProcess型で取得しています。続いて、12行目でそのプロセスの開始時刻(StartTimeプロパティ)を取得しコンソール上に表示します。そのあとは、WaitForExitメソッドで起動したメモ帳が終了するまで待ちましょう。
メモ帳が終了したら今度はExitTimeプロパティで終了時刻を取得します(15行目)。この時、ExitCodeプロパティも取得して終了コードも表示して、正常終了したのか何らかのエラーで終了したのかが分かるようにしておきましょう。通常は終了コード0が正常終了です。最後に取得した開始時刻と終了時刻から処理時間を計算し(17行目)、コンソール上に表示します。
外部プログラムの出力を読み込む
外部プログラムをアプリに組み込むには、ただ単にそれを実行するだけではなくその出力を呼び出し元のアプリで取得できる必要があります。外部プログラムを実行しっぱなしでその結果を取得することができなければ「連携できている」とは言えないですよね?
外部プログラムの出力を読み込む方法は以下の記事にまとめていますので併せてご覧ください。
コメント