C#のWPFでMainメソッドを編集する

タイトル

C#のアプリケーションは必ず Mainメソッドから始まります。
(Mainメソッドをアプリケーションのエントリーポイントといいます)

WPFを使ったアプリケーションも当然Mainメソッドからスタートします。
しかしソースを眺めてみてもMainメソッドは見当たらず、MainWindowが作成されるところから始まるように感じます。

多くの場合、MainWindowが作成されてから様々な処理が実行されればいいので気にするケースは少ないのですが、場合によってはMainWindowが作成される前に何か処理したい事があるかもしれません。



通常Mainメソッドは自動生成される

通常WPFのアプリケーションは、app.xaml (app.xaml.cs)がコンパイルされる時に app.g.cs というソースを自動生成してからコンパイルします。

コンパイル後に生成される obj/Debug/フォルダを覗いてみると App.g.cs ファイルが確認できると思います。その中身を見てみると Mainメソッドが存在しそこからアプリケーションが実行されている事が確認できます。


app.g.csファイルの自動生成をやめる

自動生成をやめるには app.xaml のプロパティから設定を変更します。
プロパティ

ソリューションエクスプローラーから「App.xaml」を見つけて右クリックしプロパティを開きます。

プロパティ
プロパティ画面のビルドアクションを「ApplicationDefintion」から「Page」へ変更します。


Mainメソッドを作成する

自動生成をやめただけでは Mainメソッドが無くなってしまいコンパイルが通りません。
エラー一覧


App.xaml.csを開いてMainメソッドを以下のように追加しましょう。

    public partial class App : Application
    {
        [STAThread]
        public static void Main()
        {
            App app = new App();
            app.InitializeComponent();
            app.Run();
        }
    }

Mainメソッドは [STAThread] という属性を指定する必要があります。
お約束と思って付けましょう。

この属性はCOMオブジェクトを扱う時の管理方法のようなもの選択するもので、シングルスレッドアパートメント (STA) とマルチスレッドアパートメント (MTA) がありますが、WPFではSTAを利用する事になっているようです。

Mainメソッド内では、Appオブジェクトを作成し実行しています。




コメント