「.NET CLI を使用して Mac Catalyst アプリを構築する」をやってみたら・・・

## 背景と目的

「.NET CLI を使用して Mac Catalyst アプリを構築する」をやってみたら・・・すんなりできないじゃん。[以前プレビュー版を入れていた](https://qiita.com/mnrst/items/a43a32424b84ed2fd432)からだと思いますが、エラーと対処方法を残しておきます。

## 前提条件

コマンドの実施環境は、Mac + .NET CLI です。

```bash:bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.4
BuildVersion:   21F79

$ dotnet --version
6.0.300
```

## .NET CLI を使用して Mac Catalyst アプリを構築する

https://docs.microsoft.com/ja-jp/dotnet/maui/macos/cli

こちらのドキュメントの通り進めてみます。

```bash:bash
# .NET MAUI の最新のパブリック ビルドをインストールします
sudo dotnet workload install maui --source https://api.nuget.org/v3/index.json

# .NET CLI を使用して新しい .NET MAUI アプリを作成します
dotnet new maui -n "MyMauiApp"
```

以下のようなメッセージが表示され MyMauiApp ディレクトリが作成されます。

```bash:bash
テンプレート ".NET MAUI App (Preview)" が正常に作成されました。

テンプレートパッケージ 'Microsoft.Maui.Templates::6.0.101-preview.10.2068' の更新プログラムを使用できます。
パッケージを更新するには、以下を使います:
   dotnet new --install Microsoft.Maui.Templates::6.0.312

'Optional workloads' プロバイダーで利用可能なテンプレート パッケージ 'Microsoft.Maui.Templates::6.0.312' の更新プログラムを使用できます。
組み込みのテンプレート パッケージを使用するには、インストールされたテンプレート パッケージを、次を使用して手動でアンインストールします:
   dotnet new --uninstall Microsoft.Maui.Templates
```

ディレクトリを MyMauiApp に変更しアプリをビルドして実行します。

```bash:bash
# ディレクトリを MyMauiApp に変更しします
cd MyMauiApp

# アプリをビルドして実行します
dotnet build -t:Run -f net6.0-maccatalyst
```

以下のようなエラーメッセージが表示されます。

```bash:bash
.NET 向け Microsoft (R) Build Engine バージョン 17.2.0+41abc5629
Copyright (C) Microsoft Corporation.All rights reserved.

  復元対象のプロジェクトを決定しています...
  /Users/testuser/Work/MyMauiApp/MyMauiApp.csproj を復元しました (482 ms)。
  Detected signing identity:
          
    Bundle Id: com.companyname.MyMauiApp
    App Id: com.companyname.MyMauiApp
/Users/testuser/Work/MyMauiApp/MainPage.xaml.cs(3,22): error CS0234: 型または名前空間の名前 'Essentials' が名前空間 'Microsoft.Maui' に存在しません (アセンブリ参照があることを確認してください) [/Users/testuser/Work/MyMauiApp/MyMauiApp.csproj]

ビルドに失敗しました。

/Users/testuser/Work/MyMauiApp/MainPage.xaml.cs(3,22): error CS0234: 型または名前空間の名前 'Essentials' が名前空間 'Microsoft.Maui' に存在しません (アセンブリ参照があることを確認してください) [/Users/testuser/Work/MyMauiApp/MyMauiApp.csproj]
    0 個の警告
    1 エラー

経過時間 00:00:11.82
```

## MainPage.xaml.cs を修正する対処方法

MainPage.xaml.cs の using Microsoft.Maui.Essentials; が存在しないようなので、一旦コメントアウトしてエラーメッセージの変化を確認してみます。

```bash:bash
# using Microsoft.Maui.Essentials; をコメントアウトします
gsed -i 's?using Microsoft.Maui.Essentials;?// using Microsoft.Maui.Essentials;?' MainPage.xaml.cs 

# アプリをビルドして実行します
dotnet build -t:Run -f net6.0-maccatalyst
```

以下のようなエラーメッセージが表示されます。

```bash:bash
.NET 向け Microsoft (R) Build Engine バージョン 17.2.0+41abc5629
Copyright (C) Microsoft Corporation.All rights reserved.

  復元対象のプロジェクトを決定しています...
  復元対象のすべてのプロジェクトは最新です。
  Detected signing identity:
          
    Bundle Id: com.companyname.MyMauiApp
    App Id: com.companyname.MyMauiApp
/Users/testuser/Work/MyMauiApp/MainPage.xaml.cs(21,4): error CS0103: 現在のコンテキストに 'SemanticScreenReader' という名前は存在しません [/Users/testuser/Work/MyMauiApp/MyMauiApp.csproj]

ビルドに失敗しました。

/Users/testuser/Work/MyMauiApp/MainPage.xaml.cs(21,4): error CS0103: 現在のコンテキストに 'SemanticScreenReader' という名前は存在しません [/Users/testuser/Work/MyMauiApp/MyMauiApp.csproj]
    0 個の警告
    1 エラー

経過時間 00:00:00.81
```

つまり SemanticScreenReader を使うために Microsoft.Maui.Essentials があるようです。

https://github.com/dotnet/maui/wiki/Migrating-to-RC1

こちらのドキュメントによると Microsoft.Maui.Essentials の SemanticScreenReader は Microsoft.Maui.Accessibility に名前空間を変更されたことがわかります。

```bash:bash
# コメントアウトを外して Essentials を Accessibility に変更します
gsed -i 's?// using Microsoft.Maui.Essentials;?using Microsoft.Maui.Accessibility;?' MainPage.xaml.cs 

# アプリをビルドして実行します
dotnet build -t:Run -f net6.0-maccatalyst
```

無事ビルドが通りアプリが実行できました。

![maui-cli-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/70d5b055-3bb7-9646-24f9-64226e49b0f8.png)

## MAUI テンプレートを更新する対処方法

上の方で `dotnet new maui -n "MyMauiApp"` した時のメッセージにあるように MAUI テンプレートを更新します。

```bash:bash
# MAUI テンプレートを更新します
dotnet new --install Microsoft.Maui.Templates::6.0.312 --force
```

以下のようなメッセージが表示されます。

```bash:bash
次のパッケージがインストールされます:
   Microsoft.Maui.Templates::6.0.312

テンプレート パッケージをインストールすると、使用可能なテンプレート パッケージがオーバーライドされます。
次のテンプレート パッケージは既に使用可能です。
   Microsoft.Maui.Templates::6.0.312

Microsoft.Maui.Templates は既にインストールされています。バージョン: 6.0.101-preview.10.2068、バージョン 6.0.312 に置き換えられます。
Microsoft.Maui.Templates::6.0.101-preview.10.2068 が正常にアンインストールされました。
成功: Microsoft.Maui.Templates::6.0.312により次のテンプレートがインストールされました。
テンプレート名                       短い名前          言語  タグ                                                     
-----------------------------------  ----------------  ----  ---------------------------------------------------------
..NET MAUI ContentPage (C#)          maui-page-csharp  [C#]  MAUI/Android/iOS/macOS/Mac Catalyst/WinUI/Tizen/Xaml/Code
.NET MAUI Blazor アプリ              maui-blazor       [C#]  MAUI/Android/iOS/macOS/Mac Catalyst/Windows/Tizen/Blazor 
.NET MAUI ContentPage (XAML)         maui-page-xaml    [C#]  MAUI/Android/iOS/macOS/Mac Catalyst/WinUI/Tizen/Xaml/Code
.NET MAUI ContentView (XAML)         maui-view-xaml    [C#]  MAUI/Android/iOS/macOS/Mac Catalyst/WinUI/Tizen/Xaml/Code
.NET MAUI ResourceDictionary (XAML)  maui-dict-xaml    [C#]  MAUI/Android/iOS/macOS/Mac Catalyst/WinUI/Xaml/Code      
.NET MAUI アプリ                     maui              [C#]  MAUI/Android/iOS/macOS/Mac Catalyst/Windows/Tizen        
.NET MAUI クラス ライブラリ          mauilib           [C#]  MAUI/Android/iOS/macOS/Mac Catalyst/Windows/Tizen        
.NET MAUI コンテンツ ビュー (C#)     maui-view-csharp  [C#]  MAUI/Android/iOS/macOS/Mac Catalyst/WinUI/Tizen/Xaml/Code
```

```bash:bash
# .NET CLI を使用して新しい .NET MAUI アプリを作成します
dotnet new maui -n "MyMauiApp2"

# ディレクトリを MyMauiApp2 に変更しします
cd MyMauiApp2

# アプリをビルドして実行します
dotnet build -t:Run -f net6.0-maccatalyst
```

テンプレートが変わるとコードもかなり変わるんですね。

![maui-cli-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/5380322e-511e-0829-dfaf-f1b5f71ab206.png)


https://devblogs.microsoft.com/dotnet/introducing-dotnet-maui-one-codebase-many-platforms/

https://github.com/dotnet/maui/wiki/macOS-Install