Visual Studio 2022(.NET 8 の MAUI)で iOS シミュレーター向けにビルドすると、Pair to Mac は成功しているのに「MSBuild was unable to connect…」で止まる――その典型的なハマりどころと復旧手順を、原因の仕組みから実行コマンド、ログの採り方まで一気に整理しました。単なるチェックリストではなく、なぜそれで直るのかを併記しているので、再発防止やチーム内のナレッジ化にもそのまま活用できます。
現象と環境
エラー内容
MSBuild was unable to connect to the Mac with Address='…' and User='…'.
This connection is separate from Visual Studio and without it the project can't build.
質問で示された前提
| 項目 | 詳細 |
|---|---|
| Windows 側 | Visual Studio 2022 17.14.13(.NET 8 MAUI) |
| Mac 側 | macOS 15.6(arm64), Xcode 16.4, .NET SDK 8.0.413 / 9.0.304 |
| 接続状態 | Pair to Mac は成功、SSH 接続も動作確認済み |
| 実施済み | キャッシュ削除、SSH 鍵再作成など基本対処は一通り実施 |
なぜ「Pair to Mac 成功なのに MSBuild で失敗」するのか(仕組み)
Visual Studio の iOS ビルドは以下の二層構造で動きます。
- IDE のペアリング層(Pair to Mac)… 開発 PC と Mac の接続・鍵配布・XMA(Xamarin.Messaging.Agent)の起動確認。
- ビルド実行層(MSBuild リモート実行)… MSBuild が Mac 上の .NET / iOS ワークロード / Xcode CLI を呼び出して実ビルドを行う層。
今回のメッセージは IDE のペアリングには成功しているが、MSBuild が Mac 上のビルド要件を満たせず接続(実行)に失敗 している典型パターンです。特に .NET MAUI のリモートタスクは プロジェクトが .NET 8 でも、ビルドホストに .NET 9 系の SDK と iOS ワークロードが必要 になる構成で、SDK の組み合わせ不整合・Xcode CLI の初期化不足・キャッシュ破損が主因になりやすいです。
結論から:有効だった対策(要約)
| 対策 | 詳細 |
|---|---|
| 1. Mac の .NET SDK を 9.0.5 以上へ更新 | VS 2022 17.14 系は ビルドホスト側に .NET 9.0.5 以上が必須。dotnet --list-sdks で確認し、必要なら 9.x を導入。 |
| 2. Xcode CLI の初期化を再実行 | Mac で sudo xcodebuild -runFirstLaunch 実行。ライセンス同意・追加コンポーネント導入・選択パスの整合性を回復。 |
| 3. MAUI / iOS ワークロードの再インストール | Windows 側は Visual Studio インストーラで「.NET MAUI」「iOS 開発ツール」を入れ直し。Mac 側は dotnet workload repair 等で修復。 |
| 4. キャッシュとペアリング情報をクリア | Windows: %LOCALAPPDATA%\Xamarin\iOS、%TEMP%\XMA など。Mac: ~/Library/Caches/Xamarin/XMA、~/Library/Logs/Xamarin.Messaging-* を削除後、再ペアリング。 |
| 5. SSH/ファイアウォール設定の再確認 | Mac の「リモートログイン」を有効。ファイアウォールで 22/TCP を許可。 |
| 6. 新規 MAUI プロジェクトで再現テスト | プロジェクト固有要因の切り分け。dotnet new maui -n TestApp → VS から iOS シミュレーター向けにビルド。 |
| 7. ワークアラウンド:iOS ワークロード 9.0.204 に固定 | Visual Studio 既知不具合の回避として iOS ワークロードを 9.0.204 へダウングレード。 |
| 8. Visual Studio を最新安定版へ更新 | Developer Community 報告の修正反映。17.14.x → 17.15 以降で改善。 |
ポイント
- ペアリング成功=ビルド可能 ではない。MSBuild が Mac 上で .NET / Xcode / ワークロードを呼び出せることが別途必要。
- .NET 8 プロジェクトでも ビルドホスト側は .NET 9 系 を要求する構成に注意。
- 未解決のときは Mac 側ログ(
~/Library/Logs/Xamarin.Messaging-*)を採取して原因セグメントを特定。
診断クイックチェック(5 分版)
| 確認内容 | Mac 側コマンド | 期待結果 |
|---|---|---|
| .NET 9 SDK の存在 | dotnet --list-sdks | grep 9.0 | 9.0.5 以上が最低 1 つ表示 |
| Xcode 初期化完了 | sudo xcodebuild -runFirstLaunch | 追加コンポーネント導入とライセンス同意が完了 |
| Xcode パス | xcode-select -p | /Applications/Xcode.app/Contents/Developer |
| iOS ワークロードの整合 | dotnet workload list | egrep 'maui|ios' | インストール済みで、エラー表示なし |
| XMA ログの直近エラー | tail -n 200 ~/Library/Logs/Xamarin.Messaging-*/Agent*.log | 例外や認証失敗が出ていない |
詳細な解決手順
1. Mac の .NET SDK を 9.0.5 以上へ更新
プロジェクトが net8.0 でも、MSBuild のリモートタスクは .NET 9 ランタイム/SDK に依存するため、Mac 側に 9.0.5 以上を導入します。
- 現在の SDK を確認:
dotnet --list-sdks - Homebrew 経由で最新 9.x を追加:
brew install --cask dotnet-sdk - 複数バージョンが共存していても問題ありません(ビルドは必要に応じて 9.x を使用)。
補足:global.json で 8.x をピン留めしていても、ビルドホストのタスク実行には 9.x の存在が必要 です。プロジェクトのターゲットとビルドホストの SDK は別レイヤーで考えましょう。
2. Xcode CLI の初期化・ライセンス同意を再実行
インストール直後の Xcode は CLI コンポーネントが揃っておらず、ビルド実行層が失敗します。以下で初期化してください。
sudo xcodebuild -runFirstLaunch
xcode-select -p
# 必要に応じて
sudo xcode-select -s /Applications/Xcode.app
実機デバイスを使わなくても、CLI の同意・追加コンポーネントは iOS シミュレーターのビルドに必須です。
3. MAUI / iOS ワークロードの整合性を回復
Mac 側(ビルドホスト)のワークロードは IDE とは独立管理です。壊れている場合は修復または入れ直しをします。
- 状態確認:
dotnet workload list - 修復:
dotnet workload repair - 入れ直し(例):
dotnet workload uninstall ios && dotnet workload install iosdotnet workload uninstall maui && dotnet workload install maui
Windows 側は Visual Studio インストーラで「.NET MAUI」「iOS 開発ツール」を入れ直します(変更の適用後、再起動を推奨)。
4. キャッシュとペアリング情報をクリアして再ペアリング
破損した XMA キャッシュや古い鍵が残っていると、IDE は接続成功と表示しても MSBuild 層が失敗します。以下を削除して再ペアリングします。
| OS | 削除対象 |
|---|---|
| Windows | %LOCALAPPDATA%\Xamarin\iOS%LOCALAPPDATA%\Xamarin\Logs%TEMP%\XMA |
| Mac | ~/Library/Caches/Xamarin/XMA~/Library/Logs/Xamarin.Messaging-*~/.ssh/known_hosts(ホストキー変更時のみ) |
削除後、Visual Studio の「ペアリング解除 → 再検索 → 再ペアリング」を実行します。
5. SSH / ファイアウォール / ネットワーク
- Mac 「システム設定 > 一般 > 共有」:リモートログインを有効。
- ファイアウォール:一時的に無効化、もしくは
22/TCPを許可。 - LAN 内 IP が変わりやすい環境では、mDNS 名(
.local)で接続すると安定します。 - 手動接続の診断:
ssh -vvv ユーザー名@Macのホスト名.local
6. 新規 MAUI プロジェクトでの再現テスト
既存プロジェクト特有の設定や古い NuGet の影響を切り分けます。
dotnet new maui -n TestApp
cd TestApp
# (必要に応じて)global.json を削除
Visual Studio で開き、iOS シミュレーター(Debug/Any CPU)を選択してビルドします。これで通るなら、元プロジェクトにのみ不整合がある可能性が高いです。
7. ワークアラウンド:iOS ワークロード 9.0.204 に固定
特定の 9.0.x で挙動が不安定な場合、安定していた 9.0.204 に一時固定する回避が有効なケースがあります。
# Mac 側(ビルドホスト)で
dotnet workload uninstall ios
dotnet workload install ios --version 9.0.204
dotnet workload list | egrep 'ios'
将来的には Visual Studio / SDK の更新で解消される見込みなので、恒久対応ではありません。更新情報の確認を運用に組み込みましょう。
8. Visual Studio を 17.15 以降へ更新
17.14 系で報告されている不具合は、以降の安定版で改善されています。Visual Studio Installer から更新し、MAUI 関連コンポーネントも再検証してください。
エラー別の見立てと対処マップ
| ログ/メッセージのキーワード | 考えられる原因 | 優先する対処 |
|---|---|---|
MSBuild was unable to connect…(本件) | ビルドホストの .NET 9 不足 / XMA キャッシュ破損 / Xcode 初期化未完 | SDK 9.0.5+ 導入 → XMA キャッシュ削除 → xcodebuild -runFirstLaunch |
Codesign failed | 証明書/プロビジョニング不整合 | Apple ID 再サインイン、証明書の再取得、プロファイル再生成 |
意図しない .NET SDK が選択 | global.json のピン留め、PATH 順序 | global.json 見直し、dotnet --info で実際の使用 SDK を確認 |
Operation timed out | ネットワーク遅延/パケット遮断 | 有線接続・同一セグメントに固定、FW ルールの一時解除 |
ログの採り方(原因を最短で掴む)
MSBuild バイナリログ(Windows 側)
- 「ツール > オプション > プロジェクトおよびソリューション > ビルド/実行」の MSBuild 出力の詳細度 を「詳細」へ。
- コマンドラインの例:
msbuild /bl:out.binlog /v:diag
XMA(Xamarin.Messaging)ログ(Mac 側)
- 場所:
~/Library/Logs/Xamarin.Messaging-*/ - 直近を見る:
ls -lt ~/Library/Logs/Xamarin.Messaging-*tail -n 300 ~/Library/Logs/Xamarin.Messaging-*/Agent*.log
この 2 系統が揃えば、どの層で失敗しているか(IDE か、MSBuild か、Mac 側タスクか)が明確になります。再現頻度が高い場合は、ログ採取のための再現専用プロジェクト(手順 6)を用意すると解析が早まります。
再発防止の運用テンプレート
- 月次:Mac 側の
dotnet --list-sdksを共有メモに貼り、9.x の存在をチェック。 - 四半期:Xcode / Visual Studio / MAUI ワークロードの更新をまとめて実施し、専用検証プロジェクトでビルド確認。
- イベント駆動:Xcode 更新直後は必ず
sudo xcodebuild -runFirstLaunchを実行。 - キャッシュ衛生:ビルド不可の兆候が出たら、早期に XMA キャッシュ削除&再ペアリング。
よくある質問(FAQ)
Q. プロジェクトが .NET 8 なのに、なぜ Mac に .NET 9 が要る?
A. リモートビルドのタスク実行や MAUI/iOS ワークロードが 9 系のランタイム/SDK を前提にしているためです。コンパイル対象の TFM と、ビルドホストの実行環境は別レイヤーとして扱われます。
Q. Rosetta/Intel 互換は関係ある?
A. 近年の SDK/ワークロードは arm64 を前提に最適化されています。ターミナルや dotnet が Rosetta(x86_64)で動いていると失敗の温床になります。ターミナルを arm64 で起動し、dotnet --info の RID が osx-arm64 になっているか確認しましょう。
Q. それでも直らないときは?
A. 新規 MAUI プロジェクトでの再現可否と、MSBuild バイナリログ + XMA ログを添えて、チーム/コミュニティに共有すると解析が早まります。とくに ~/Library/Logs/Xamarin.Messaging-*/ 下の例外栈と、Mac 側の SDK/ワークロード一覧が決め手になります。
付録:コマンドとチェックリストまとめ
Mac 側:一括点検スクリプト例(必要なものだけ実行)
# 1) .NET SDK
echo "=== dotnet SDK ==="
dotnet --info
dotnet --list-sdks
# 2) ワークロード
echo "=== workloads ==="
dotnet workload list
# 3) Xcode
echo "=== xcode ==="
xcode-select -p
sudo xcodebuild -runFirstLaunch
# 4) XMA ログ(直近)
echo "=== XMA logs (latest) ==="
ls -lt ~/Library/Logs/Xamarin.Messaging-*
tail -n 200 ~/Library/Logs/Xamarin.Messaging-*/Agent*.log
# 5) SSH 疎通
echo "=== ssh ==="
ssh -vvv -o StrictHostKeyChecking=accept-new ユーザー名@ホスト名.local exit || true
Windows 側:初期化の手順メモ
- Visual Studio Installer で「.NET MAUI」「iOS 開発ツール」を選択し修復。
- キャッシュ削除:
%LOCALAPPDATA%\Xamarin\iOS、%TEMP%\XMA。 - Visual Studio 再起動 → Pair to Mac → iOS シミュレーターでビルド。
まとめ
本件の本質は「Pair to Mac の成功」と「MSBuild が Mac 側ツールチェーンを実際に呼び出せること」は別問題だという点です。.NET 9.0.5 以上の SDK を Mac に導入し、Xcode CLI を正しく初期化、MAUI/iOS ワークロードの整合を取る――この 3 点を先に固め、必要に応じてキャッシュ再生成とバージョン固定(9.0.204)で安定化させれば、多くのケースで解決します。ログ採取と新規プロジェクトでの再現テストをセットにしておけば、次回以降のトラブルシュートも格段に速くなります。
(参考)作業チェック表(運用に貼れる簡易版)
| チェック | 完了 | メモ |
|---|---|---|
Mac に .NET 9.0.5+ がある(--list-sdks) | □ | |
Xcode を -runFirstLaunch で初期化 | □ | |
iOS / MAUI ワークロードが正常(workload list) | □ | |
| XMA キャッシュを削除して再ペアリング | □ | |
SSH(ssh -vvv)で疎通 | □ | |
| 新規 MAUI プロジェクトでビルド可 | □ | |
| 必要なら iOS ワークロードを 9.0.204 に固定 | □ | |
| Visual Studio を 17.15+ に更新 | □ |

コメント