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()です。
あとがき
今回はProcessクラスの紹介でした。
多分ツール系だけじゃなくて本処理の方でも
使うんじゃないかなと思ってます。
(別言語で作られたプログラムとか)
今回は必ず最後にKillしたんでいいですが、
Killしないと最悪メモリリーク起こすんで注意です。
せっかくIDisposeもつけてくれてますし、
何もなければusing句使うのが安全だと思います。
それでは今回はこの辺でノシ