【C#】フォーム起動前に処理を実行する話

経緯

VB.NETで開発されたフォームアプリケーションをC#で開発されたシステムに移管するとき、
「ApplicationEvents.vbにスタートアップ処理があるから気をつけてね~」と言われ、いつも通りに
ソースコードを確認して移管作業を始めようとしたら、

あれ?C#にApplicationEvents無くね?

という事態に…(-_-;)

ということで、C#でフォーム起動前に処理を実行する方法(VB.NETのApplicationEvents.vbのStartUpに相当)を紹介します!

フォーム起動前に何を実行したいのか

そもそもフォーム起動前に何を実行したいの?っていう話は開発するシステムの内容次第ではありますが、よくあるのは『バージョン更新時にユーザー設定値(プロパティ)を引き継ぐ』処理はアプリを起動して、フォームが開かれる前に実行したいのではないかと思われますね。

↓プロパティについてはこちら↓

C#のスタートアップ処理の実装

では、簡単な実装例の紹介です。

まず、適当にフォームの作成とコードの実装、プロパティ値の設定です。

Form

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestProgram
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button_表示_Click(object sender, EventArgs e)
        {
            label1.Text = Properties.Settings.Default.defaultString;
        }

        private void button_設定_Click(object sender, EventArgs e)
        {
            Properties.Settings.Default.defaultString = textBox1.Text;
            Properties.Settings.Default.Save();

            MessageBox.Show("設定が完了しました!", "", MessageBoxButtons.OK);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label2.Text = "Ver:" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
        }
    }
}

表示ボタンじゃなくてフォームロード時に表示すればよくね?って感じですね…
まぁ、お気になさらず。

まずは、テキストボックスにデフォルトとは異なる文字列を適用に入力して設定して再度表示してみると、こんな感じになります。

user.configもしっかりと更新されていますね。(↓は一部抜粋)

<userSettings>
        <TestProgram.Properties.Settings>
            <setting name="defaultString" serializeAs="String">
                <value>テステステス</value>
            </setting>
        </TestProgram.Properties.Settings>
    </userSettings>

プロパティ値の設定ができているので、次にバージョンを更新します。

1.0.0.1にバージョン更新

バージョン更新したので、再度プログラムを起動して表示ボタンを押してみると…

プロパティ値がデフォルトに戻っている。user.configを確認すると、バージョン1.0.0.1のディレクトリ自体が作られていないので、そもそもユーザーの設定ファイルが作られていない。

バージョンを上げた状態で再度設定操作をすれば新たに設定されるのですが、ユーザー側としたらだいぶ不便ですよね・・・

というわけで、アプリ起動時にバージョンが更新されていた場合に、プロパティ値を引き継ぐ実装例。

実装はProgram.csに書きます。

プロパティにバージョン更新フラグ的なのを作成。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TestProgram
{
    static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            //バージョン更新されている場合にプロパティ値を引き継ぐ
            //アプリケーション関連の処理の前に実装する
            //バージョンが変わるとプロパティのデフォルト値が参照されるので、フラグがfalseになる
            if(Properties.Settings.Default.verUpdateFlg == false)
            {
                Properties.Settings.Default.Upgrade();
                Properties.Settings.Default.verUpdateFlg = true;
                Properties.Settings.Default.Save();
            }

            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

これでプログラムを実装してみると

設定操作をしていなくても前バージョンの値を引き継いでいますね。
ちなみに、user.configの格納ディレクトリも新バージョンのフォルダが作成されています。

最後に

というわけで、プロパティの引き継ぎを例に、アプリ起動時に処理を実行することができましたね。

今回はアプリ起動時に実行する必要はないような内容でしたが、例えばプロパティ値をグローバル変数などに格納する処理がある場合は、フォームが動き始めてからだと遅いので、プログラム起動時に何かしらする必要がありますね。

もし、この内容がためになったなどのコメントがありましたら、

もつきちのTwitterをフォローの上、DM等でコメントしてくれると嬉しいです!
Twitter:@Motsukichi_

読んでくださり、ありがとうございました!

コメント

タイトルとURLをコピーしました