Windows Server 2019で.NET MAUI自己完結EXEがcoreclr.dll 0xc0000005クラッシュする原因と安全な回避策

Windows Server 2019 上で .NET MAUI の自己完結型 EXE を動かそうとして、起動直後に coreclr.dll の 0xc0000005(Access Violation)でクラッシュ…というトラブルは、実は .NET MAUI/WinUI 3 と Windows Server の相性問題が背景にあります。本記事では、なぜこの現象が起きるのか、公式サポート状況と既知のバグ、そして実務レベルで取り得る回避策を整理して解説します。

目次

Windows Server 2019 で .NET MAUI 自己完結 EXE がクラッシュするシナリオ

今回のケースは、だいたい次のような構成です。

  • .NET 9(または .NET 8/10 系)+ .NET MAUI を使用
  • Windows 向けに自己完結型 EXE(self-contained)で発行
  • WindowsPackageType=None(=MSIX ではなく「生 EXE」)
  • 発行コマンド例: dotnet publish -f net9.0-windows10.0.19041.0 -c Release ^ -p:WindowsPackageType=None ^ -p:WindowsAppSDKSelfContained=true ^ -p:RuntimeIdentifierOverride=win10-x64 ^ --self-contained
  • 配置先 OS:Windows Server 2019

この構成で EXE を起動すると、アプリのウィンドウが出る前に落ちてしまい、イベントログには次のようなエラーが記録されます。

  • 障害のあるアプリケーション名:<アプリ名>.exe
  • 障害のあるモジュール名:coreclr.dll
  • 例外コード:0xc0000005(Access Violation)

重要なのは、「管理コード(C# 側)の例外」ではなく「CLR ランタイム DLL(coreclr.dll)のネイティブクラッシュ」である点です。つまり、あなたのアプリコードが動き出す前に、ランタイムと OS まわりの相性で落ちている可能性が高い、ということです。

.NET MAUI/WinUI 3 と Windows Server のサポート状況

.NET MAUI の Windows 対応は「クライアント OS 前提」

.NET MAUI の公式ドキュメントでは、Windows 向けアプリの対応プラットフォームとして次のように明記されています。

  • Windows 11
  • Windows 10 バージョン 1809 以降
  • UI フレームワークは WinUI 3 を使用

ここに「Windows Server 2019 / 2022」といったサーバー OS の記載はありません。

また、別の公式情報でも「.NET MAUI で Windows アプリをビルドすると、WinUI 3 を使うため、実行対象は Windows 10 1809 以降と Windows 11 になる」と説明されています。

つまり、.NET MAUI の Windows サポートはあくまで「クライアント OS を前提」に設計されており、Windows Server 系列はテストもサポートもされていない、という立ち位置です。

Q&A でも「Server は対象外」と明言されている

Microsoft Q&A では、Windows Server 2016 や 2019 で .NET MAUI アプリが動かないという質問に対して、公式回答として「.NET MAUI の Windows ターゲットは Windows 11 と Windows 10 1809 以降であり、Server OS は含まれない」といった趣旨の説明がなされています。

また、WinUI 3 自体についても、「Windows Server 2019 上での動作は保証されていない」といった議論が GitHub の issue で繰り返されており、Server 2019 で WinUI 3 ベースのアプリ(=.NET MAUI Windows アプリ)が不安定になるのは珍しい話ではありません。

OS ごとのサポート状況まとめ

OS.NET MAUI Windows の公式サポートコメント
Windows 11◯(正式サポート)WinUI 3 ベースでテストされているメインターゲット。
Windows 10 1809 以降◯(正式サポート)企業 PC などのクライアント環境向け。LTS 版も多く運用されている。
Windows Server 2022△(公式には明記なし)内部バージョンは Windows 10 21H2 系であり、動くケースは多いが、公式サポート対象とは書かれていない。
Windows Server 2019×(サポート外)公式ドキュメントに記載なし。Q&A や GitHub でも「動作保証外」として扱われている。
Windows Server 2016 / 2012 R2 など×(サポート外)OS の世代が古く、WinUI 3 / Windows App SDK の前提を満たさない。

0xc0000005(Access Violation)が発生する背景

管理コードではなく「CLR ランタイムのネイティブクラッシュ」

0xc0000005 は、Windows でおなじみの「メモリアクセス違反」を表す例外コードです。C# で throw した通常の例外とは異なり、次のような場面で発生します。

  • ネイティブ DLL が不正なアドレスを参照した
  • CPU 命令と実行環境(アーキテクチャ/OS ビルド)の前提が食い違っている
  • ランタイムが内部的に使用している API が OS に存在しない/挙動が違う

.NET MAUI Windows アプリの場合、実際に落ちているのは coreclr.dll(.NET ランタイム)や Windows App SDK/WinUI 3 のネイティブ DLL であるケースが多く、「アプリ本体の C# コードに到達する前」に OS との相性でクラッシュしていることがよくあります。

self-contained(自己完結)EXE が問題を増幅する理由

self-contained EXE として .NET MAUI アプリを発行すると、次のような構成になります。

  • .NET ランタイム一式(coreclr.dll など)
  • アプリのアセンブリ/リソース
  • Windows App SDK のネイティブ DLL 群

一見すると「全部同梱されているなら、どこでも動きそう」に思えますが、実際には次のような OS 側の前提に強く依存しています。

  • WinUI 3 が前提とする Windows API(COM コンポーネントやシステム DLL)のバージョン
  • Windows App SDK のブートストラップ処理が想定している OS ファミリ
  • フォント/DirectX/グラフィックスドライバー周りの機能

Server 2019 では、これらの前提条件が Windows 10/11 クライアントと完全に一致しておらず、「必須機能はあるがバージョンが古い」「存在することを想定していたコンポーネントがインストールされていない」といったズレによって、coreclr.dll や WinUI 3 の初期化中にアクセス違反を引き起こしてしまいます。

まず行うべき調査:Debug ビルドでのスタックトレース取得

Release ビルドだけでは情報が足りない

Microsoft Q&A でも、今回と同様のケースに対して「まず Debug ビルドで発行し、詳細なスタックトレースを取得するべき」と案内されています。

理由はシンプルで、Release ビルドでは最適化やトリミングが効いているため、どの DLL のどの関数で落ちたのかが Event Viewer からは追いにくくなるからです。

Debug で self-contained を発行する例

一度、次のように Debug ビルドで self-contained 発行してみましょう。

dotnet publish -f net9.0-windows10.0.19041.0 -c Debug ^
  -p:WindowsPackageType=None ^
  -p:WindowsAppSDKSelfContained=true ^
  -p:RuntimeIdentifierOverride=win10-x64 ^
  --self-contained

そのうえで、サーバー上で起動してクラッシュさせ、次の情報を確認します。

  • Windows のイベントビューアー(アプリケーションログ)のエラー詳細
  • スタックトレースに WinUI/WindowsAppSDK/グラフィックス関連 DLL が含まれていないか
  • シンボルが解決できるなら、どの関数呼び出しで Access Violation が発生しているか

ここで「ユーザーコードが一切出てこない」のであれば、OS とランタイムの相性問題である可能性が非常に高くなります。

より踏み込んだ解析(必要な場合)

本格的に Microsoft にフィードバックするつもりがある場合は、次のツールでクラッシュダンプを採取しておくと良いでしょう。

  • ProcDump(procdump -e -ma <PID> など)
  • dotnet-dump コマンド
  • WinDbg での手動アタッチ

ただし、サポート対象外 OS である以上、「バグとして受け付けられても修正予定なし(not planned)」となる可能性が高い点には注意が必要です。

Windows Server 2019 + self-contained EXE の既知の問題

Server 2019 では「起動すらしない」ケースが多数報告

GitHub や Q&A では、Server 2019 上で self-contained な .NET MAUI / WinUI 3 アプリを実行すると、次のような症状が報告されています。

  • EXE を起動してもウィンドウが一瞬出てすぐ消える(イベントログには coreclr.dll の 0xc0000005)
  • 何も画面に出ず、イベントログにもほとんど情報が残らない
  • Windows App SDK をインストールしようとしても途中でクラッシュする
  • Server 2019 だけで発生し、Windows 10 / 11 では正常に動作する

なかには「GitHub issue が立てられたものの、Server 2019 がサポート対象外であるため closed as not planned になった」というパターンもあり、根本的な修正が入る見込みは薄い状況です。

「動く環境」と「動かない環境」の差分

興味深いのは、同じバイナリでも以下のような差分で挙動が変わることです。

  • Windows 10 上:self-contained EXE で問題なく起動
  • 別の Windows 10 / 11 上:Windows App SDK ランタイムを事前インストールすると起動する
  • Server 2019 上:Windows App SDK のインストール時点でクラッシュし、アプリも起動しない

このことから、「self-contained だから OS 非依存で動く」のではなく、「self-contained でも OS に強く依存している」ことが分かります。

実務的な回避策:どの道を選ぶべきか

ここからは、運用現場で現実的に取りうる回避策を整理します。

方策概要Server 2019 のクラッシュ回避期待度
MSIX パッケージで配布WindowsPackageType=MSIX で発行し、App Installer からインストール。高(ただし Server 2019 自体が非サポートである点は変わらない)
self-contained をやめるWindowsAppSDKSelfContained=false にし、OS 側に Windows App SDK ランタイムを配置。中〜高(環境によっては改善)
サポート対象 OS へ移行Windows 10 / 11 または Server 2022 へプラットフォームを移行。最高(最も再現性が高く、ベストプラクティス)
ビルドオプションを緩和PublishTrimmed / PublishSingleFile を無効化するなど。中(クラッシュするコードパスを避けられることがある)
SDK / ツール更新 + ダンプ解析.NET / Windows App SDK / VS を最新化し、クラッシュダンプを採取。中(既知バグ修正の恩恵を受けられる可能性)

MSIX パッケージで配布する

.NET MAUI の公式ドキュメントと Q&A では、「Windows アプリを配布する際は MSIX パッケージとして配布し、App Installer からインストールする」ことが推奨されています。

ポイントは次の通りです。

  • インストール時に必要なランタイムや依存コンポーネントが適切に登録される
  • ショートカットやスタートメニュー統合、アンインストールなどが OS の仕組みで管理される
  • エンドユーザーにとって「信頼されたアプリ」として扱われやすい

発行コマンドの例:

dotnet publish -f net9.0-windows10.0.19041.0 -c Release ^
  -p:WindowsPackageType=MSIX ^
  -p:GenerateAppxPackageOnBuild=true

MSIX にしたからといって Server 2019 が「サポート OS になる」わけではありませんが、「self-contained 生 EXE よりは動作が安定する」ケースが多く見られます。

Windows App SDK を OS 側にインストールし、自己完結をやめる

もう一つの発想は、「self-contained をやめて OS にランタイムを任せる」方法です。具体的には以下のようにします。

  • プロジェクトファイル(.csproj)で: <PropertyGroup> <WindowsAppSDKSelfContained>false</WindowsAppSDKSelfContained> </PropertyGroup>
  • 発行時に --self-contained を指定せず、framework-dependent として出力
  • サーバー側に対応バージョンの Windows App SDK ランタイムと .NET ランタイムをインストール

実際、Windows 10 クライアントでは「Windows App SDK をインストールしたら MAUI EXE が起動するようになった」という報告があり、この構成変更によって Server 2019 でも起動できるようになるケースがあります。

ただし、先述の通り Server 2019 自体がサポート外であるため、「環境によっては改善する」程度の期待値に留めておくのが現実的です。

サポート対象 OS(Windows 10 / 11 / Server 2022)への移行

根本的には、.NET MAUI を本番運用するなら「公式サポート対象 OS に乗せる」のが最も安全です。具体的には次のような選択肢があります。

  • クライアント PC:
    • Windows 10 22H2(長期運用が必要なら LTSC エディション)
    • Windows 11 23H2 以降
  • サーバー OS(RDS/VDI 向け):
    • Windows Server 2022(内部的には Windows 10 21H2 系)

RDS や VDI 環境で MAUI クライアントを提供したい場合も、「Server 2019 上で無理に動かす」より「Server 2022 + Windows 10/11 クライアント相当の環境」を用意した方が、長期的なトラブル回避につながります。

ビルドオプションを緩和してトリミング/単一ファイル化を無効化

自動トリミングや単一ファイル化はとても便利ですが、ネイティブとの絡みが複雑な .NET MAUI では思わぬ副作用を生むことがあります。特に:

  • PublishTrimmed=true によって必要な型/メソッドが誤って削除される
  • PublishSingleFile=true で単一ファイルにまとめることで、特定環境でのロード順やパス解決が変わる

Server 2019 でのみ発生するクラッシュの場合、「環境依存の微妙な違い」がこれらの最適化と組み合わさり、coreclr.dll での Access Violation につながる可能性があります。まずは次のようにオプションを緩和し、ふるまいが変わるかを確認してみてください。

<PropertyGroup>
  <PublishTrimmed>false</PublishTrimmed>
  <PublishSingleFile>false</PublishSingleFile>
</PropertyGroup>

サイズは大きくなりますが、「とにかくクラッシュを止めて原因を切り分けたい」という段階では有効なアプローチです。

最新 SDK への更新とクラッシュダンプによる切り分け

.NET MAUI や Windows App SDK は、リリースごとに多数のバグ修正が入っています。Visual Studio 17.x 系の更新だけで Windows 向け MAUI アプリの起動問題が解消された事例もあります。

そのため、次の順で環境をアップデートしていくことを推奨します。

  1. .NET SDK を最新の LTS/最新安定版へ更新
  2. Visual Studio(または CLI)側の .NET MAUI workload を最新に更新
  3. Windows App SDK のランタイム/フレームワークパッケージを最新版へ

それでも解決しない場合は、前述の通りクラッシュダンプを取得し、「Server 2019 固有の問題なのか」「特定のドライバーやサードパーティ DLL が絡んでいるのか」を切り分けていくと、別の回避策が見えてくることがあります。

用途別:どの構成を選ぶべきかの目安

利用シナリオ推奨 OS推奨配布形態Server 2019 利用時の注意
社内クライアント PC での業務アプリWindows 10 1809+ / 11MSIX(ストア外配布ならサイドロード)Server 2019 は避ける。どうしても必要なら RDS/VDI 上のクライアント OS を利用。
RDS / VDI 上でのマルチユーザー利用Windows Server 2022MSIX + ユーザー別プロファイル2019 では coreclr.dll クラッシュのリスクが高い。検証しても安定しなければ移行必須。
オンプレ GUI 管理ツールWindows 10/11 または Server 2022MSIX または framework-dependent EXEServer 2019 での自己完結 EXE は避ける。WPF/WinForms など別フレームワークへの切り替えも検討。
ライトなユーティリティ/診断ツールWindows 10/11self-contained でも可だが、トリミングは慎重にServer 2019 では self-contained より MSIX+ランタイム分離の方が安全。

どうしても Windows Server 2019 で動かしたい場合のチェックリスト

サポート対象外であることを理解したうえで、それでも「既存の Server 2019 環境からすぐには動かせない」というケースもあると思います。その場合に試してみる価値があるチェックポイントをまとめます。

  1. アプリを Debug ビルドで self-contained 発行し、詳細なスタックトレースを確認する
  2. PublishTrimmed=false、PublishSingleFile=false にして再度テストする
  3. WindowsAppSDKSelfContained=false にして、Windows App SDK ランタイムをサーバーにインストールする
  4. MSIX パッケージとして発行し、App Installer からインストールしてみる
  5. .NET SDK / Windows App SDK / Visual Studio を最新に更新する
  6. グラフィックスドライバーやリモートデスクトップ環境(GPU 仮想化など)の設定を確認する
  7. それでもダメなら、クラッシュダンプを採取し、「MAUI+Server 2019 の組み合わせ自体が限界」かどうかを判断する

このチェックリストのどこかで「Windows 10 / 11 では正常に動くのに Server 2019 ではどうしてもダメ」という状態まで確認できれば、「アプリ側ではなく OS サポート範囲の問題」と社内に説明しやすくなります。

.NET MAUI が合わない場合の代替案

「Windows Server 上で GUI アプリを動かしたいだけ」であれば、必ずしも .NET MAUI にこだわる必要はありません。代替として考えられる選択肢をいくつか挙げます。

  • WPF / WinForms (.NET 8/9)
    Server 2019 / 2022 での実績が豊富で、self-contained EXE との相性も比較的良好です。
  • 純 WinUI 3 デスクトップアプリ
    こちらもサポート対象は Windows 10/11 ですが、「MAUI なしで WinUI 3 だけを使う」ことで依存関係を減らし、問題切り分けをしやすくできます。
  • ブラウザベースの管理画面(Blazor / ASP.NET Core)
    GUI を Web 化し、サーバー側は IIS/Kestrel 上の Web アプリとして動かす構成です。クライアント OS 依存を最小限にできます。

.NET MAUI は「モバイル+デスクトップを単一コードベースで」という点では非常に魅力的ですが、「Windows Server 上で thick client 的に使う」用途には向いていません。用途に合わせてフレームワークを選びなおすのも、長期的に見れば堅実な選択です。

まとめ:原因と最も現実的な解決策

ここまでの内容を整理すると、今回の「Windows Server 2019 上で .NET MAUI 自己完結 EXE が起動直後に coreclr.dll で 0xc0000005 を出して落ちる」問題は次のように理解できます。

  • 原因の本質:
    • .NET MAUI / WinUI 3 の Windows 対応は、Windows 10 1809 以降と Windows 11 のクライアント OS を前提にしている
    • Windows Server 2019 は公式サポート対象外であり、WinUI 3 / Windows App SDK の前提と OS の実装が微妙にズレている
    • self-contained EXE では、そのズレが coreclr.dll などのネイティブクラッシュとして顕在化しやすい
  • もっとも確実な対処:
    • サポート対象 OS へ移行する(Windows 10/11 または Server 2022)
    • MSIX パッケージとして配布し、App Installer 経由でインストールする
  • 当面の応急策として試せること:
    • Debug ビルドでスタックトレースを取り、ユーザーコードではなくランタイム側で落ちていることを確認する
    • PublishTrimmed=false、PublishSingleFile=false、WindowsAppSDKSelfContained=false など、ビルドオプションを緩和して挙動の変化を確認する
    • .NET SDK / Windows App SDK / Visual Studio を最新化しつつ、クラッシュダンプを用意しておく

「Server 2019 でもたまたま動いている MAUI アプリ」は今後も存在し得ますが、それはあくまで「たまたま」であり、いつ壊れてもおかしくない地盤の上に立っています。Windows 向け .NET MAUI アプリを業務で長期運用するなら、「クライアント OS への移行」と「MSIX によるパッケージ配布」を前提に設計し直すことを強くおすすめします。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次