vorfee's Tech Blog

Just another tech blog

SDK形式のcsprojを持つWPFプロジェクトでApp.xamlのMainメソッド自動生成を抑制する方法

SDKプロジェクトのWPFアプリケーションでMainメソッド自動生成を防止する。

Microsoftの公式リファレンスに載っている情報なのだが、忘れやすいためメモ。公式リファレンスの記載場所は以下。

Microsoft.NET.Sdk.Desktop の MSBuild プロパティ - .NET | Microsoft Docs

本記事の適用可能対象フレームワーク

.NET 5以降もおそらくWPFである限りは適用可能。

結論

csprojファイルにEnableDefaultApplicationDefinitionを追加する。

<PropertyGroup>
  <EnableDefaultApplicationDefinition>false</EnableDefaultApplicationDefinition>
</PropertyGroup>

上記を追加した後のcsprojファイルは、以下のようになる。

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net461</TargetFramework>
    <UseWPF>true</UseWPF>
    <EnableDefaultApplicationDefinition>false</EnableDefaultApplicationDefinition>
  </PropertyGroup>

</Project>

WPFのMainメソッド

Mainメソッドの自動生成を抑制したなら、自力でMainメソッドを作成する必要がある。一般にProgram.csというファイルをプロジェクトに追加し、以下の内容を記載する。

(1)最小形

Visual Studioが自動生成するコードと同じ。

namespace WpfApp1
{
    public static class Program
    {
        [System.STAThread]
        public static void Main()
        {
            var app = new App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

(2)スプラッシュスクリーンを表示

スプラッシュスクリーンを表示する場合、プロジェクトにスプラッシュスクリーンを追加し、メインメソッドの先頭でSystem.Windows.SplashScreen.Showを呼ぶ。

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <!-- 中略 -->

  <ItemGroup>
    <SplashScreen Include="SplashScreen1.png" />
  </ItemGroup>

</Project>
namespace WpfApp1
{
    public static class Program
    {
        [System.STAThread]
        public static void Main()
        {
            var splashScreen = new System.Windows.SplashScreen("SplashScreen1.png");
            splashScreen.Show(autoClose: true);
            var app = new App();
            app.InitializeComponent();
            app.Run();
        }
    }
}