C# - 外部プログラムの実行

利用都度、調べていたのでまとめる。

ソースコード

これが必要

using System.Diagnostics;

StartInfoを設定して、Processオブジェクトを生成する。
要Disposeなのでusingを付ける。

using var p = new Process
{
    StartInfo =
    {
        // 実行プログラムパス
        FileName = @"dotnet.exe",
        // 実行時引数
        Arguments = @"--info",
        // 標準出力をリダイレクト
        RedirectStandardOutput = true,
        // OSシェルを使用しない
        UseShellExecute = false
    }
};
// 起動
p.Start();
// 標準出力を読み取る
Console.WriteLine(p.StandardOutput.ReadToEnd());
// 終了を待つ
p.WaitForExit();

上記コードで、コマンドライン上にて dotnet --info した時と同じ出力が得られる

メモ

  • StartInfoで実行開始パラメータを設定する
    • FileNameで起動プログラムパスを指定、Argumentsで実行引数指定
    • Argumentsはコマンドライン時と同じようにスペース区切りで複数の引数を指定してOK
    • RedirectStandardInput/Output/Error を true にするとそれぞれリダイレクトが有効になる
    • その他、ワーキングディレクトリとかユーザとか指定できたりする
  • 実行開始後リダイレクト有効であれば、ProcessStandardInput/Output/ErrorそれぞれにStreamReader/Writerとしてアクセスできる
  • エンコーディングの考慮が必要な場合は実行前にStartInfoで指定しておくこと
  • FileNameが実行ファイル(exeなど)でない場合は、UseShellExecuteをtrueにして関連付けられたアプリケーションを起動する。たぶん。
  • リダイレクトする場合、UseShellExecuteはfalseにしろって言われる
  • .NET Framework と Core でデフォルト値の異なるプロパティがあるようだ

See also