C#から外部プログラムを使おう
作成日: 2004/4/4  最終更新日: 2005/1/18



◆概要

C#プログラムから,Internet Explorerなどの既存の外部プログラム(プロセス)を呼び出したい,というときには,System.Diagnostics.Process クラスを利用します.
ここでは, 指定した外部プログラムに引数を与えて起動できるシンプルなサンプルプログラムを作ってみました(図1).

図2は,InternetExplorerを起動して,"http://mobiquitous.com/"にアクセスしている例です.

図1 ProcessSampleのスクリーンショット

 


使用前   使用後
図2 Internet Explorerの呼び出し例




◆ダウンロード

◆インストール

このソフトは .NET + C# で書かれているため,事前に Microsoft .NET Framework再頒布パッケージ (23.7 MB) をインストールしておく必要があります. .Net Frameworkがインストールされていれば,実行ファイルを起動すれば動作するはずです.

ページトップへ




◆プロセスの開始

Internet Explorerを起動して"http://mobiquitous.com/"を開くためのコードは以下のようになります.
Process.StartInfo.FileNameにプログラム名を,Process.StartInfo.Argumentに起動時の引数を指定します.

    using System.Diagnostics;
 
    string program = @"C:\Program Files\Internet Explorer\IEXPLORE.EXE";
    string argument = @"http://mobiquitous.com/";

    Process extProcess = new Process();
    extProcess.StartInfo.FileName = program;	//起動するファイル名
    extProcess.StartInfo.Arguments = argument;	//起動時の引数

    extProcess.Start();							//プロセス開始

 

ページトップへ





◆プロセスの停止

上記のようにして作成した外部プロセスを終了する場合は,Process.Kill()かProcess.CloseMainWindow()を利用します.

    if(extProcess!=null)
extProcess.Kill();

このコードでは外部プロセスだけが終了してくれそうなものですが,なぜかProcess.Kill()を呼び出したスレッド自身も同時に終了されてしまうようです.サンプルプログラムでは,以下のように外部プロセスを担当する専用スレッドを作ることで問題を回避しています.(もっといいやり方があるかもしれませんが…)

    using System.Diagnostics;
    using System.Threading;


    Process extProcess = null;
    Thread extThread = null;
    string program = @"C:\Program Files\Internet Explorer\IEXPLORE.EXE";
    string argument = @"http://mobiquitous.com/";

    //外部プロセス処理スレッドの開始&終了
    private void ControlProcess(bool start)
    {
        if(!start && extThread!=null)
        {
            extThread.Abort();
            extThread = null;
        }
        else if(start && extThread ==null)
        {
            extThread = new Thread(new ThreadStart(ProcessWorker));
            extThread.Start();
        }
    }

    //外部プロセスを起動するためのスレッド
    private void ProcessWorker()
    {
        //外部プロセスの起動
        try
        {
            extProcess = new Process();
            extProcess.StartInfo.FileName = program;//起動するファイル名
            extProcess.StartInfo.Arguments = argument;
            extProcess.Start();
        
            //スレッドが終了されるまで待機
            while(true)
            {
                Thread.Sleep(100);
            }
        }
        catch(ThreadAbortException ex)
        {
        }
        catch(Exception ex)
        {
        }
        finally
        {
            if(extProcess!=null)
                extProcess.Kill();	//外部プロセスの終了(同時にこのスレッドも終了される)
            extThread.Abort();
            extThread = null;
        }
    }
このメソッドの使い方は以下のようになります.
ControlProcess(true);	//外部プロセスを開始
ControlProcess(false);   // 外部プロセスを終了

ページトップへ




◆参考URL



[俄プログラマー心得]