業務のためのC#・C言語・C++学習

主にC#の文法やWPF周りのアウトプットに利用してます。

【C#】GUIアプリケーションからの外部プログラム呼び出し

GUIアプリケーションから外部の実行可能ファイルを直接呼び出すことは一般的なアプローチです。これにより、ユーザーがアプリケーション内で特定の操作を実行できるようになります。以下は、C#のアプリケーションから外部プログラムを呼び出し、その外部アプリケーションの標準出力をreturnする例です。

        public string RunExternalProgram()
        {

            // 外部プログラムのパス
            string programPath = @"C:\path\External.exe";

            // コマンドライン引数(必要に応じて設定)
            string arguments = "--boot AAA..";

            // 外部プログラムの実行
            ProcessStartInfo startInfo = new ProcessStartInfo(programPath, arguments);
            startInfo.RedirectStandardOutput = true;
            startInfo.UseShellExecute = false;
            startInfo.CreateNoWindow = true;

            Process process = new Process();
            process.StartInfo = startInfo;

            string output = "";
            process.OutputDataReceived += (s, args) => output += args.Data + Environment.NewLine;
            process.Start();
            process.BeginOutputReadLine();

            process.WaitForExit();

            return output;
        }

この例では、RunExternalProgram メソッドが外部プログラムを実行し、その結果を文字列として返す機能 を提供しています。外部プログラムの出力は、process.OutputDataReceived イベントハンドラを使用して受信し、結果を output 変数に追加しています。

GUIアプリケーションが実行されるディレクトリ(カレントディレクトリ)が、外部ファイルが存在するディレクトリと異なる場合

コマンドライン引数で何かしらのファイルを指定している場合、カレントディレクトリが正しくなくエラーが出る可能性があります。カレントディレクトリはGUIアプリケーションを実行している位置になります。したがって外部プログラムが異なるディレクトリの場合は引数で指定したファイルのディレクトリが想定と異なりエラーが起きます。

カレントディレクトリを一時的に変更するプログラムです。

        public string RunExternalProgramChengedDirectory()
        {
            // 現在のカレントディレクトリを保存
            string originalWorkingDirectory = Directory.GetCurrentDirectory();

            try
            {
                // 新しいカレントディレクトリを設定
                string workingDirectory = @"C:\path";
                //カレントディレクトリの変更
                Directory.SetCurrentDirectory(workingDirectory);

                // 外部プログラムのパス
                string programPath = @"C:\path\External.exe";

                // コマンドライン引数(必要に応じて設定)
                string arguments = "--boot AAA..";

                // 外部プログラムの実行
                ProcessStartInfo startInfo = new ProcessStartInfo(programPath, arguments);
                startInfo.RedirectStandardOutput = true;
                startInfo.UseShellExecute = false;
                startInfo.CreateNoWindow = true;

                Process process = new Process();
                process.StartInfo = startInfo;

                string output = "";
                process.OutputDataReceived += (s, args) => output += args.Data + Environment.NewLine;
                process.Start();
                process.BeginOutputReadLine();

                process.WaitForExit();

                return output;
            }
            finally
            {
                // 元のカレントディレクトリに戻す
                Directory.SetCurrentDirectory(originalWorkingDirectory);
            }
        }

上記のコードでは、RunExternalProgramChengedDirectoryメソッド内で一時的にカレントディレクトリを変更し、プログラムを実行しています。実行が終了した後、finally ブロック内で元のカレントディレクトリに戻しています。

この方法を使用すると、外部プログラムの実行時に一時的にカレントディレクトリを変更してファイルが存在するディレクトリに移動し、実行後に元のカレントディレクトリに戻すことができます。