none
Application.Run()の戻り値について RRS feed

  • 質問

  • いろいろMSDNの翻訳やネットで調べていますが、いまいちわからないので教えてください。

    プログラムで、少しmain()回りで処理をしてからformのプログラムをApplication.Runで呼び出しをしていますが、その場合、Application.runで戻り値を設定(例えば正常終了=0、異常終了=1)することは可能なのでしょうか?
    その場合、処理はmain=>form=>mainになると考えていいのでしょうか?それともmain=>formで、formの戻り値がそのままプログラム終了時の戻り値と考えるのが正しいのでしょうか?

    2018年3月7日 6:24

回答

  • Application.Run メソッドは void なので何か値を返すというようにはできないと思いますが、exe の終了コードは下記のように設定できます。(Main メソッドが void の場合)

    Environment.ExitCode = 0; // exe の終了コードを設定


    Main メソッドが int を返す場合は、その値が Environment.ExitCode よりも優先されるようです。例えば Form で何らかの戻り値を設定したい場合は下記のようなコードで実現できます。

    using System.Windows.Forms;
    
    namespace ConsoleApplication1
    {
        public partial class Form1 : Form
        {
            public int Result { get; private set; }
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                Result = 1000; // 終了時のコードを設定
            }
        }
    
        class Program
        {
            static int Main(string[] args)
            {
                Form1 form1 = new Form1();
                Application.Run(form1);
                int nReturnValue = form1.Result;
                return nReturnValue;
            }
        }
    }

    参考サイト: 
    https://msdn.microsoft.com/ja-jp/library/0fwzzxz2(v=vs.120).aspx
    https://stackoverflow.com/questions/6643598/returning-value-to-main-c-sharp

    2018年3月7日 6:50

すべての返信

  • Application.Run メソッドは void なので何か値を返すというようにはできないと思いますが、exe の終了コードは下記のように設定できます。(Main メソッドが void の場合)

    Environment.ExitCode = 0; // exe の終了コードを設定


    Main メソッドが int を返す場合は、その値が Environment.ExitCode よりも優先されるようです。例えば Form で何らかの戻り値を設定したい場合は下記のようなコードで実現できます。

    using System.Windows.Forms;
    
    namespace ConsoleApplication1
    {
        public partial class Form1 : Form
        {
            public int Result { get; private set; }
            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                Result = 1000; // 終了時のコードを設定
            }
        }
    
        class Program
        {
            static int Main(string[] args)
            {
                Form1 form1 = new Form1();
                Application.Run(form1);
                int nReturnValue = form1.Result;
                return nReturnValue;
            }
        }
    }

    参考サイト: 
    https://msdn.microsoft.com/ja-jp/library/0fwzzxz2(v=vs.120).aspx
    https://stackoverflow.com/questions/6643598/returning-value-to-main-c-sharp

    2018年3月7日 6:50
  • ちょっとApplication.Runに拘りすぎな気がします。これも普通のメソッド呼び出しにすぎないので。ただ、Application.Runは、メインフォームが閉じられる、あるいはApplication.Exitが呼び出される、などまで返ってこなくなります。この辺は、Application.Runの行とその次の行に2つブレークポイントを張って動作を確認すればすぐわかるかと思います。

    プロセスが値を返したいなら、Application.Run(および、あるなら後処理も)のあとに、Mainの最後でreturn 返値;とすればいいです(Environment.Exit(返値)で直ちにプロセスを終了させることもできますが、正常系の処理ではないでしょう)。

    2018年3月7日 6:55
  • ちょっとApplication.Runに拘りすぎな気がします。これも普通のメソッド呼び出しにすぎないので。

    というか、シンプルに自動で作成されるところで見ていますので(私自身まだまだ分かってませんから)、こだわってるというよりは自動で出されてるからどうなのかなぁと。

    mainの最後でReturnっていうのは昔のC(実は私はこれより前でまともにVisual Studioを触ったことはほとんどなく、まっとうにやってたのはMS-Cまでさかのぼる始末です・・・・)でわかってはいたのですが、ほとんどの処理がform側で行われてしまうため、その場合ってどうなんだろうなぁと思い質問した次第です。すいません。
    メソッドの呼び出しには何種類かあるのは知ってますが・・・
    2018年3月7日 11:51
  • なるほど、ありがとうございました。
    これですっきりしました!!
    2018年3月8日 0:15
  • Cの知識とのことですので、違いについて説明を。

    main()から始まるコンソールアプリケーションですとコマンドプロンプトから起動され、終了するとコマンドプロンプトに戻り、その際の戻り値が意味を持ちますが、今回話題に取り上げているGUIアプリケーションですとエクスプローラー等から起動され、終了しても特に起動元は関与しないことが多いです。そのため、戻り値をあまり意識していないというのが実情かもしれません。

    もちろんC#においてもコンソールアプリケーションであればCと同様にMainの戻り値を扱えます。

    2018年3月8日 2:42