none
スタートアップフォームのコンストラクタでプログラムの実行を終了させるには? RRS feed

  • 質問

  • お世話になります。

    スタートアップフォーム frmMain に OpenFileDialogを貼り付けています。

    このことが原因で、ネットワークドライブ上にexeを置くと、frmMainのコンストラクタの

    InitializeComponentでセキュリティ例外が発生した旨、ダイアログが表示されます。

    セキュリティ例外が発生するのは、しょうがないので、せめてネットワークドライブにexeを

    おかないでほしい旨表示して、静かに実行を終了したいと思います。

    そこで、以下のように、コードを書き換えたのですが

    こんどは、catchの中のApplication.Exitがセキュリティ例外となります。

    この場所で、exe自体の実行を終了させるには、どのようなコードを書けば

    いいのか教えてください。(Application.Exitは適切でないと思われるので

    Application.Exitにはこだわりません)

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            public frmMain()
            {
                try
                {
                    InitializeComponent();
                }
                catch
                {
                    MessageBox.Show("Cドライブにexeを配置してください");
                    Application.Exit();
                }
            }

     

    2006年8月8日 3:06

回答

  • メインエントリ ポイント(通常 Program.cs のなか)にこんなかんじで書いたら
    大丈夫そうでしたが、いかがでしょう。

    # 普通はセキュリティ例外の場合とそうじゃない場合でわけないとダメでしょうが

           [STAThread]
            static void Main()
            {
                try{
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Form1());
                }
                catch
                {
                    MessageBox.Show("だめです");
                    return;
                }
            }

    2006年8月8日 4:27

すべての返信

  • メインエントリ ポイント(通常 Program.cs のなか)にこんなかんじで書いたら
    大丈夫そうでしたが、いかがでしょう。

    # 普通はセキュリティ例外の場合とそうじゃない場合でわけないとダメでしょうが

           [STAThread]
            static void Main()
            {
                try{
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Form1());
                }
                catch
                {
                    MessageBox.Show("だめです");
                    return;
                }
            }

    2006年8月8日 4:27
  • mars12

    ありがとうございます。

    頂いたコードを使って、Main中でプログラム終了させることできました。

    フォームのコンストラクタ中での例外だけに特定させたいので

    コンストラクタで例外発生時に、自作の例外を再発生させて、それをMainで拾うように

    しました。

    他の人の参考のために、以下にコードを記します。

    ////////////// Program.cs  //////////////

        static class Program
        {
            /// <summary>
            /// アプリケーションのメイン エントリ ポイントです。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                try
                {
                    Application.Run(new Form1());
                }
                catch (InvalidZoneException)
                {
                    MessageBox.Show("Cドライブにexeを配置してください");
                }
            }
        }

        public class InvalidZoneException:Exception
        {
        }

    //////////////////////// Form1.cs /////////////////////////////////

        public partial class Form1 : Form
        {
            public Form1()
            {
                try
                {
                    InitializeComponent();
                }
                catch
                {
                    throw new InvalidZoneException();
                }
            }


        }

    2006年8月8日 6:47