.NET MAUI 9(.NET 9)をMac環境で進めていると、「Autofacの最新版はそのまま使えるの?」「デバッグ実行は動くのにRelease(発行/デバッグなし)だと落ちる…」という2つの悩みが絡みがちです。結論と、実務で迷わないための確認手順をまとめます。
.NET MAUI 9(.NET 9)×MacでAutofac最新版は使えるのか:結論
まず押さえておきたいのは、「参照できる(インストールできる)」と「実行時に問題なく動く(Debug/Releaseどちらも)」は別物だという点です。MAUI 9(.NET 9)でAutofacを使う場合も、ここを切り分けると判断が速くなります。
結論としては、NuGet上のAutofacは“互換性の観点では”.NET 9でも利用できる可能性が高い一方で、Microsoft側がAutofacの動作保証を公式に断言できる立場ではないため、最終判断はAutofac側の情報(NuGet/GitHub)と自分のプロジェクト条件(トリミング/AOT/リフレクション利用など)で決めるのが現実的です。
| 確認したいこと | 意味 | 判断の目安 | おすすめの確認先 |
|---|---|---|---|
| インストールできるか | NuGet参照として追加でき、ビルドが通るか | 多くの場合「通る」 | NuGet(対象TFM)、実プロジェクトでRestore/Build |
| Debugで動くか | ローカル実行(デバッグあり)で基本機能が動くか | ここが通れば“まず一歩” | 最小構成の実機/シミュレータ/エミュレータで確認 |
| Releaseで動くか | 最適化(トリミング/リンク/AOT等)が入った状態でも動くか | ここで差が出やすい | MAUIのトリミング資料、Autofacのクロスプラットフォーム注意点 |
Autofacは「Microsoft公式サポート」とは別枠になる
Microsoft Q&Aの回答でも明確ですが、AutofacはMicrosoft製ではないため、Microsoft側のフォーラムで「MAUI 9でAutofac最新版が公式にサポートされる」と断言するのは難しい、という扱いになります。これは「使えない」という意味ではなく、“最終的な互換性判断はライブラリの提供元(Autofac)で確認する”という整理です。
実務的には次の2段構えにすると安全です。
- まずNuGetの対象フレームワーク(TFM)と更新状況を見て、.NET 9で参照できそうか判断する
- 怪しい挙動(特にReleaseのみ不具合)が出るなら、AutofacのGitHub Issuesで同様事例を探す/最小再現を添えて相談する
最新版のAutofacは何で、.NET MAUI 9(.NET 9)と噛み合うのか
NuGet上のAutofacは、最新としてAutofac 9.0.0が公開されており、.NET 8.0 / .NET Standard 2.0をターゲットにしています(.NET 9は一般に“上位互換として利用される”前提で互換扱いになりやすい構造です)。
また、ASP.NET Core系でよく使う統合パッケージのAutofac.Extensions.DependencyInjectionは、NuGet上で10.0.0が公開され、.NET 6.0 / .NET Standard 2.0をターゲットにしています。MAUI側(.NET 9)で参照する場合でも、TFMの観点では十分に噛み合うケースが多いです。
| パッケージ | 用途 | NuGet上の最新(参考) | 主なターゲット | MAUI 9で見るポイント |
|---|---|---|---|---|
| Autofac | DIコンテナ本体 | 9.0.0 | .NET 8 / .NET Standard 2.0 | 「参照できる」だけでなく、Release最適化下での挙動(反射/スキャン)を見る |
| Autofac.Extensions.DependencyInjection | Microsoft.Extensions.DependencyInjection統合 | 10.0.0 | .NET 6 / .NET Standard 2.0 | MAUIのServiceCollectionとつなぐ要(ConfigureContainer等) |
Microsoft Q&Aの実例:.NET 9 MAUIプロジェクトにAutofacを追加できる
Microsoft Q&Aには、まさに「MAUI 9(.NET 9)MacでAutofac最新版はサポートされるのか?」という質問があり、回答では次のように整理されています。
- Autofacはサードパーティであり、Q&Aで公式サポートを断言する対象ではない
- NuGet上では主に.NET 8向けに見えるが、一般に.NET 9は後方互換がある
- .NET 9のMAUIプロジェクトに、当時の最新版(例:Autofac 8.2.0)をPackageReferenceとして追加できることは確認できる
- 疑わしい場合はAutofacのGitHub Issuesで確認・相談するのが筋
そして質問者自身も、GitHub Issue作成の流れを経て「サポートされている(動作した)」旨を共有しています。
ここで大事なのは、“参照できること”と“Releaseまで含めて安定して動くこと”を分けて考えることです。後者の問題が混ざると「Autofacが原因に見える」状態になりやすいので、次章の切り分けが効いてきます。
Mac環境でハマりやすい:Debugは動くのにReleaseで落ちる原因パターン
「デバッグありだと動くのに、デバッグなし(Release実行/発行)だと動かない」は、Autofacそのものというより、Release時の最適化や挙動差が引き金になっていることがよくあります。MAUIでは特に、トリミング(リンク)やAOT、リフレクション絡みで差が出やすいです。
トリミング(ILLink)による挙動差
.NET MAUIはアプリサイズ削減のために、リンク(トリミング)を行えます。ILLinkは「使われていない」と解析されたメンバーを削除するため、反射で動的に参照する型/メソッドがあると、Releaseでだけ欠けて落ちることがあります。
特にMac絡みだと、Mac CatalystやiOSでのビルド条件が絡みます。Microsoft Learnの説明では、例えば次のような“デフォルト差”が明示されています。
- AndroidとMac CatalystのReleaseは、既定で部分トリミングが使われる
- iOSは実機ビルドで構成に関係なく部分トリミングが使われ、シミュレータはトリミングしない
つまり「Debugで動く」「Releaseでだけ落ちる」が成立しやすい前提が最初からあります。
「フル」トリミングやNative AOTを有効にしている
Release最適化として、Publish時にフル トリミングやNative AOTを入れていると、反射依存のコードはさらに壊れやすくなります。Microsoft Learnでも、Native AOT時には自動的にフル トリミングが走るため、TrimModeの扱いに注意する旨が書かれています。
Autofacの自動登録(アセンブリスキャン)×反射の組み合わせ
Autofacは「自動配線(コンストラクタ解決)」や「アセンブリスキャンによる登録」のような便利機能があり、これらは反射と相性が強い領域です。クロスプラットフォーム/ネイティブ環境では、反射が“そのままでは成立しない/削られる”ケースがあるため、追加の設定が必要になることがある、とAutofacドキュメントでも触れられています。
例外が表に出ない(ログ不足)
Debugではブレークや詳細例外が見えるのに、Releaseではクラッシュして「落ちた」しか分からない、という状況もあります。ここが曖昧だと、DI設定ミスなのか、リンクの影響なのか、初期化順序なのかが判断できません。Releaseで落ちる場合ほど、ログと最小再現が重要になります。
| 症状 | ありがちな原因 | 確認ポイント | まずやる対処(切り分け) |
|---|---|---|---|
| DebugはOK、ReleaseだけDI解決例外 | トリミングで必要な型/メンバーが消えた | Release時にトリミングが有効か | 一時的にトリミング影響を弱めて再現性が変わるか確認 |
| Releaseでだけ起動直後にクラッシュ | AOT/最適化で初期化順が変わる、反射が失敗 | Publish設定、AOTの有無 | 最小再現プロジェクトで同条件を作って現象を固定化 |
| 特定画面に遷移した瞬間に落ちる | 遅延解決した依存関係で反射/型解決が失敗 | どの型の解決で落ちるか | DI解決箇所をログ化し、例外内容を確実に取る |
まずはここから:最小再現(Minimal Repro)で切り分ける
「Autofacの互換性問題なのか」「MAUIのRelease最適化問題なのか」を最短で判断するには、最小再現が効きます。実務では、いきなり本番アプリの巨大な依存関係を追うより、次の順序が速いです。
手順のイメージ
- 新規のMAUI 9プロジェクトを作る(空テンプレでOK)
- Autofac(必要ならAutofac.Extensions.DependencyInjectionも)を追加
- 1〜2個のサービスだけ登録して、画面表示時に解決する
- DebugとReleaseで、それぞれ同じ操作をして差分を確認する
MAUIは標準でMicrosoft.Extensions.DependencyInjectionを使うため、Autofacを単に参照しただけでは“MAUIのDIとしては使われません”。AutofacをDIコンテナとして組み込むなら、MauiAppBuilderのConfigureContainerを使って、AutofacのServiceProviderFactoryを接続するのが王道です。Stack Overflowでも、このアプローチが具体例として示されています。
MAUIにAutofacを接続する例
using Autofac;
using Autofac.Extensions.DependencyInjection;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
})
.ConfigureContainer(new AutofacServiceProviderFactory(), autofac =>
{
// ここにAutofac登録を書く(Buildは呼ばない)
// autofac.RegisterType<MyService>().As<IMyService>().SingleInstance();
});
// それ以外の通常登録はbuilder.ServicesでOK
// builder.Services.AddSingleton<...>();
return builder.Build();
}
}
ここまで作って、Releaseのみで落ちるなら「Autofacそのもの」よりも「Release最適化×反射/型解決」の線が濃くなります。
Releaseで落ちる場合の実務的な対処:まず“原因特定”、次に“最適化と両立”
Releaseのみ不具合は、最適化を緩めると消えることが多いです。ただし、最適化を恒久的にオフにしてよいかは別問題です。おすすめは次の2段階です。
段階1:まず原因を確定させる(トリミング/リンクが犯人か)
MAUIのトリミングはILLinkが関与します。まずは「トリミングが入ると壊れるのか」を切り分けてください。Microsoft Learnでも、トリミングにより未使用メンバーが削除され、互換性のないコードは警告(trim warnings)が出るので、警告を解消しつつ十分にテストすべき、とされています。
コミュニティでも「Releaseが動かない問題は、トリミングやAOTを無効化して解決した」という報告があります(あくまで一例)。
段階2:必要なコードを“保持”して最適化と両立する
トリミングが原因だと分かったら、次は「どの型/メンバーが削られて困っているのか」を特定し、保持する方向に寄せます。MAUI(Androidのリンク設定例)では、次のような手段が案内されています。
- DynamicDependency属性で動的参照を宣言して保持する
- TrimmerRootAssemblyで特定アセンブリをトリミング対象から外す
- TrimmerRootDescriptorでXMLルート指定し、型/メンバーを保持する
| 手段 | 向いている状況 | メリット | 注意点 |
|---|---|---|---|
| DynamicDependency | 自分のコード側で反射対象が分かっている | 必要最小限に保持できる | 指定漏れがあると再発しやすい |
| TrimmerRootAssembly | 外部ライブラリの内部が原因で手が出せない | 手早く“丸ごと保持”できる | サイズ増、保持範囲が広くなりがち |
| TrimmerRootDescriptor(XML) | 保持したい型/メンバーをある程度絞れる | 外部ライブラリでも制御しやすい | 管理が増える(更新で追従が必要) |
例えば、Android向けのリンク設定ドキュメントでは、XML(トリマーのディスクリプタ形式)を指定して型/メンバーを保持できることが説明されています。
Autofac側の観点:ネイティブ/クロスプラットフォームでは“反射に追加対応が必要”になり得る
Autofacのドキュメントにも、Xamarinやネイティブコンパイル環境では、反射が絡む機能のために追加作業が必要になることがある、と書かれています。例として、リンク設定でAutofacアセンブリを保持するようなXML例も挙げられています。MAUIはXamarinの後継にあたるため、考え方としては同じ罠にハマり得ます。
実務的に言うと、次のような使い方はRelease最適化の影響を受けやすいので注意が必要です。
- アセンブリスキャンで大量に自動登録する
- 名前や属性を頼りに型を動的に探す
- 実行時にAssembly.Loadしてプラグイン的に読み込む
対策として、まずは「明示的登録(RegisterType/As/SingleInstanceなど)中心に寄せる」「必要なら保持設定を足す」という順で安定化させると、MAUIでは事故率が下がります。
困ったときの相談先:情報が散らばるならサポートチケットも選択肢
今回のように、Autofac互換性の話と「Releaseのみ不具合」が絡むと、コメントやスレッドが増えて情報が散らばりがちです。Microsoft Q&Aでも、複数スレッドに情報が散逸して原因特定が難しいケースはフォーラムの範囲を超えるため、MAUIのサポートチケットで状況整理してもらう提案がされています。
一方で、Autofac自体の互換性や不具合の最終判断はAutofac側になるので、最小再現(Minimal Repro)を添えてAutofacのGitHub Issuesへという動線も強力です。MAUI/ランタイム側の問題か、Autofac側の問題かを切り分けたうえで投げると、解決速度が上がります。
チェックリスト:.NET MAUI 9(.NET 9)×Autofac×Macで詰まらないために
| チェック項目 | 見るべき理由 | 具体的なアクション |
|---|---|---|
| NuGetのターゲットTFMと更新日 | .NET 9での参照可否の一次判断になる | Autofac/統合パッケージのTFMと最新版を確認 |
| AutofacをMAUIのDIに接続できているか | 参照しただけではMAUIのDIは置き換わらない | ConfigureContainerでAutofacServiceProviderFactoryを使う |
| Releaseだけの差(トリミング/AOT) | “DebugはOK、ReleaseはNG”の典型原因 | トリミング設定・Publish設定の差を把握し、保持設定を検討 |
| 最小再現が作れているか | 原因の切り分けと相談の質が決まる | 依存を減らしたプロジェクトで再現させる |
| 相談先を間違えていないか | MicrosoftとAutofacで責任範囲が違う | Autofacの問題はGitHub、MAUI全体はサポートチケットも検討 |
この順で整理できると、「Autofac最新版は使えるの?」という疑問に対して、単なるYes/Noではなく、自分のプロジェクト条件で“どこまでが互換で、どこからが最適化との相性問題か”まで判断できるようになります。

コメント