はかせのラボ

私の頭の中を書いていく雑記ブログです

C# プログラムから別プログラムを起動しよう ~Processクラス~

あいさつ

どうも、はかせです。
今回はC#でツール作ってると結構な頻度でほしくなる
自分以外のプログラムの起動や終了の待ち合わせをやります。

C#にはそれらをうまいことやってくれる
Processクラスってのがあるので
今回は私が良く使う辺りをメインに書いていきます。

この辺使えるようになってくると
既存のツールを使いながらそのツールではできない
イカサマなんかがやりやすくなって、
出来ることの幅がぐんと増えるので
是非見てってくださいね。

環境

Windows10
Visualstudio2017
.NET Framework 4.6.1

using

using System.Diagnostics;

プロセスの起動

//普通にパス指定で実行
var proc = Process.Start("実行するプログラムのパス");

//プロセススタート用クラスを使う
var procInfo = new ProcessStartInfo
{
    FileName = "実行するプログラムのパス",
    UseShellExecute = true
}
var proc = Process.Start(procInfo);

//なんなら直でプロセス作っちゃってもおk
var proc = new Process();
proc.FileName = "実行するプログラムのパス";
proc.UseShellExecute = true;
proc.Start();

他のプログラム、つまりプロセスを実行するのは
Process.Start()を使います。

このメソッドの引数に実行するプロセスを渡してやることで
何も言わずすっとプロセスを立ち上げてくれます。

戻り値には実行したプロセスを
管理するクラスのインスタンスが返ってきます。

このクラスインスタンスを色々こねれば
プロセスは大抵どうにかなります。

ちなみに三つ目でやってますが、
直接クラスインスタンスを作って値を入れて、
Startメソッド呼んでもいいです。

あとUseShellExecuteっていうboolなんですが、
こいつは基本trueでいいです。
こいつがtrueじゃないとシェルコマンド使えなくて
色々不便なので。
(別段困ることもないし)
(なぜかProcess.Start()のオーバーロードにbool入れるやつないんだよな)

プロセスの終了待ち合わせ

//プロセス終了を待つ
proc.WaitForExit();
//ミリ秒単位で時間指定もできる
proc.WaitForExit(1000);
//終了時のイベントハンドラーに登録でもいいよ
proc2.Exited += (o, e) => Console.WriteLine("Exited");

プロセスの終了待ち合わせには
WaitForExit()
Exited

このどちらかを使います。

前者はプロセスが終わるのを素直に待ちます。
時間を指定してやればその分だけ待って
終わらなかったら待機を解除します。

後者はイベントハンドラーで
プロセスが終了したらイベントが発火されます。

個人的にはハンドラにラムダで処理くっつけるのを
よくやります。

プロセスの終了

//お前(プロセス)を殺す
proc.Kill();

プロセスの終了は
Kill()です。

LinuxとかのCUIだとKillコマンドがあるんで
その辺触ってる人はわかりやすいかもですね。

あとがき

今回はProcessクラスの紹介でした。

多分ツール系だけじゃなくて本処理の方でも
使うんじゃないかなと思ってます。
(別言語で作られたプログラムとか)

今回は必ず最後にKillしたんでいいですが、
Killしないと最悪メモリリーク起こすんで注意です。

せっかくIDisposeもつけてくれてますし、
何もなければusing句使うのが安全だと思います。

それでは今回はこの辺でノシ