新しもの好きプログラマの耳より情報ブログ

仕事でもあるプログラミングについて役に立ちそうな情報を発信していこうというブログです。役に立たなそうな情報はfacebookで。

.NET MAUIで普通のデスクトップアプリをビルドするには

概要

.NET MAUIで、普通のデスクトップアプリをビルドする方法の話です。普通というのは、msixインストーラで配布するパッケージではなく、exeとdllを作ってmsiインストーラなどで配布するタイプのアプリです。

先に結論まとめ

  • プロジェクトファイルに<WindowsPackageType>None</WindowsPackageType>を追加
  • launchSettings.jsonのcommandNameをProjectに
  • 発行はdotnet publishコマンドに「p:WindowsPackageType=None」を付ける
  • 以上で、普通のデスクトップアプリとしてビルド・デバッグ・発行ができます
  • ただしまだ問題点が多いようなので、実運用の開発への採用は要注意

話の背景

.NET MAUIでWindowsアプリを作ろうとすると、msixインストーラで配布するという形の、どちらかというと個人向けのアプリ開発に特化したテンプレートや説明になっています。

しかし今までWPFなどでビジネス向けアプリのGUIを作っていたという場合、普通のデスクトップアプリを作って、msiインストーラなどで配布したい、となると思います。私はそうです。

MAUIやWinUI 3ではそういうものをパッケージされていない(Unpackaged)アプリと呼ぶようです。しかしそれを作ろうとすると・・・意外なほどテンプレートも説明もまとまっていません。どちらかというと、「少しずつサポートしていく予定だが、後回し」という雰囲気です。

そのためWebの情報などを色々当たって、正しそうだと思ったやり方をまとめました。

やりかた

ビルド・デバッグ

テンプレートでプロジェクトを作成した直後は、msixを使用したストアアプリを作る設定になっています。そのためUWPなどと同様に、デバッグ実行しようとすると「開発者モードをONにしろ」と言われます。

まずはこれを、WPFなどと同様にデスクトップアプリをビルド・デバッグ実行する設定に変更します。

プロジェクトファイルを開きます。VisualStudioなら、プロジェクトファイルをダブルクリックです。 XMLProjectPropertyGroupと辿り、その中に<WindowsPackageType>None</WindowsPackageType>という要素を追加します。

次のようになります。XML全体は長いので追加分は上の方に入れて、それ以降は省略しました。

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
        <WindowsPackageType>None</WindowsPackageType>

次にソリューションエクスプローラへ戻り、プロジェクトの「Properties\launchSettings.json」ファイルを開きます。

次のようにMsixPackageを指定している部分があるので、これをProjectに変更します。

"commandName": "MsixPackage"

"commandName": "Project"

次のようになります。

{
  "profiles": {
    "Windows Machine": {
      "commandName": "Project",
      "nativeDebugging": false
    }
  }
}

以上の変更で、ビルド・デバッグはOKです。そのままビルド・デバッグ実行すると、デスクトップアプリとしてデバッグ実行されます。Windowsの開発者モードをONにする必要もありません。

発行

2024/2頃のVisualStudio 2022 Ver.17.9.1で試すと、プロジェクトファイルを上記のように変更した時点で、GUIからの「発行」が無効になります。発行はコマンドでやるしかなさそうです。

これについてはMS Docsにも情報がありました。 Use the CLI to publish unpackaged apps for Windows - .NET MAUI | Microsoft Learn

基本は次のようなコマンドになると思います。

dotnet publish -f net8.0-windows10.0.19041.0 -c Release -p:RuntimeIdentifierOverride=win10-x64 -p:WindowsPackageType=None

この記事でのポイントは -p:WindowsPackageType=None になります。プロジェクトファイルの記載と同じで、これによって普通のデスクトップアプリとして発行されます。

PublishSingleFileは未完成の様子

発行は問題なくできますが、大量のdllファイルが一緒に出来上がるので、1ファイルにまとめられるならまとめてしまいたい場合も有ると思います。この記事のように普通のデスクトップアプリにする場合でも、dotnet publishのPublishSingleFileオプションが使えます。

使えますが・・・未完成なのか、正常動作しないようです。

オプションを付けて実行すると、dllファイルはかなり減り、その分だけexeファイルのサイズが大きくなります。しかし、かなり減っただけでdllファイルはいくつか残っています。(ネイティブのdllかもしれませんが)また、実行するとエラーコード0xc000027bで異常終了します。

注意点

以上で普通のデスクトップアプリを作って動かすことは一応できました。ただ、次のissueを見た感じでは、まだまだ課題が残っていて開発途上のようです。実運用の開発に採用するにはまだ、クリティカルな問題が無いかどうかを慎重にチェックしながら使う必要がありそうです。

Windows Unpackaged support in .NET MAUI · Issue #10564 · dotnet/maui · GitHub

まとめ

.NET MAUIで普通のデスクトップアプリを作ることは、情報を集めれば一応できるようです。まだ実用には怖いところですが、WinUI 3やWPFなどの状況を考えると今後.NET MAUIがデスクトップアプリの有力な選択肢に入ってくる可能性は高いと思うので、少しずつでも調べて実戦投入に備えておくのが良いと思います。