窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

maui-blazorテンプレートでアプリを作ってハマった場所とかのメモ Preview4 to Preview5のmigration関係

Microsoft Buildで取り上げられたMAUIを試してみた系のメモです。

完全にPreviewPreviewってレベルで、本当にバグでもなんでも来いの人が試すといいと思います。

Buildを見てすぐに試した人はPreview4のはずです。Preview4と5の話を色々していくので、適宜これは4の話です、5の話ですを書いていこうかなと。 6月11日にPreview5が利用出来るようになったので(アナウンスはまだなされていません)基本的にはPreview5を使ったほうがいいです(理由は後述)。

試行錯誤しているリポジトリ

github.com

こちらです、興味のある方はごらんください。

最初にやること

Getting Started · dotnet/maui Wiki · GitHub

これに沿って進めましょう。 今回はStep.1 でmauiプロジェクトではなくて、maui-blazorプロジェクトを作ります。

テンプレートやパッケージの更新

現在利用しているtemplateがどれかを確認します。

$ dotnet new -u
Currently installed items:
  Microsoft.Maui.Templates
    Version: 6.0.100-preview.4.634
    Details:
      Author: Microsoft
    Templates:
      .NET MAUI Blazor App (maui-blazor) C#
      .NET MAUI App (maui) C#
    Uninstall Command:
      dotnet new -u Microsoft.Maui.Templates

こんな感じの表示が出たらPreview4のテンプレートです。

これをまずはアップデートしましょう。

$ dotnet new -u Microsoft.Maui.Templates
Success: Microsoft.Maui.Templates::6.0.100-preview.4.634 was uninstalled.

$ dotnet new -i Microsoft.Maui.Templates
The following template packages will be installed:
  Microsoft.Maui.Templates

Success: Microsoft.Maui.Templates::6.0.100-preview.5.760 installed the following templates:
Template Name         Short Name   Language  Tags
--------------------  -----------  --------  ------------------------------------------------
.NET MAUI App         maui         [C#]      MAUI/Android/iOS/macOS/Mac Catalyst/WinUI
.NET MAUI Blazor App  maui-blazor  [C#]      MAUI/Android/iOS/macOS/Mac Catalyst/WinUI/Blazor

こうすると最新のPreview5のテンプレートが降ってくるのでこれを使いましょう。

よりも、maui-checkをアップデートする方が自分の中では正解だなになったので、こっちをやっていきます。

$ dotnet tool update -g Redth.Net.Maui.Check
ツール 'redth.net.maui.check' がバージョン '0.5.0' からバージョン '0.5.5' に正常に更新されました。
$ maui-check --preview
(以下略)

で今日時点ではPreview5が降ってくるようになります。 テンプレートやWorkloadが同時にアップデートされるのでこれが推奨されるやり方でしょう。

ですが、これでPreview5関連パッケージ落としてきてもまだrestore出来ません。

 dotnet restore
  復元対象のプロジェクトを決定しています...
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102: バージョン (= 6.0.0-preview.5.21301.5) のパッケージ Microsoft.NETCore.App.Runtime.Mono.iossimulator-x64 が見つかりません
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 1 バージョンが nuget に見つかりました。 [ 最も近いバージョン: 6.0.0-preview.4.21253.7 ]
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 0 バージョンが maui-preview に見つかりました
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102: バージョン (= 6.0.0-preview.5.21301.5) のパッケージ Microsoft.NETCore.App.Runtime.Mono.android-arm64 が見つかりません
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 1 バージョンが nuget に見つかりました。 [ 最も近いバージョン: 6.0.0-preview.4.21253.7 ]
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 0 バージョンが maui-preview に見つかりました
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102: バージョン (= 6.0.0-preview.5.21301.5) のパッケージ Microsoft.NETCore.App.Runtime.Mono.android-x86 が見つかりません
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 1 バージョンが nuget に見つかりました。 [ 最も近いバージョン: 6.0.0-preview.4.21253.7 ]
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 0 バージョンが maui-preview に見つかりました
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102: バージョン (= 6.0.0-preview.5.21301.5) のパッケージ Microsoft.NETCore.App.Host.linux-arm64 が見つかりません
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 52 バージョンが nuget に見つかりました。 [ 最も近いバージョン: 6.0.0-preview.4.21253.7 ]
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 0 バージョンが maui-preview に見つかりました
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102: バージョン (= 6.0.0-preview.5.21301.17) のパッケージ Microsoft.AspNetCore.App.Runtime.linux-arm64 が見つかりません
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 52 バージョンが nuget に見つかりました。 [ 最も近いバージョン: 6.0.0-preview.4.21253.5 ]
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 0 バージョンが maui-preview に見つかりました
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102: バージョン (= 6.0.0-preview.5.21301.5) のパッケージ Microsoft.NETCore.App.Runtime.Mono.maccatalyst-x64 が見つかりません
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 1 バージョンが nuget に見つかりました。 [ 最も近いバージョン: 6.0.0-preview.4.21253.7 ]
/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj : error NU1102:   - 0 バージョンが maui-preview に見つかりました
  /Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/tmp/tmp/tmp.csproj を復元できませんでした (1.92 sec)。

こんな感じで Microsoft.NETCore.App.Runtime.Mono.* 系統がrestore出来ないので、dotnet runtimeのnightlyを落とせるようにしましょう。

runtime/dogfooding.md at main · dotnet/runtime · GitHub

$ dotnet nuget add source -n dotnet6 https://dnceng.pkgs.visualstudio.com/public/_packaging/dotnet6/nuget/v3/index.json

これでrestore出来るようになります、スタートまでが遠い。

適宜パッケージのみのアップデートを行いたい場合は dotnet-outdatedを使うとかで上げるのがいいんじゃないかな。

コードの変更

Preview5のtemplateで作った場合ならここは無視してよいです。

Preview4でtemplateを作った場合はbinやobjディレクトリを消し去って、csprojを

- <PackageReference Include="Microsoft.AspNetCore.Components.WebView.Maui" Version="6.0.100-preview.4.*" />
+ <PackageReference Include="Microsoft.AspNetCore.Components.WebView.Maui" Version="6.0.100-preview.5.*" />
- <PackageReference Include="Microsoft.Maui" Version="6.0.100-preview.4.*" />
+ <PackageReference Include="Microsoft.Maui" Version="6.0.100-preview.5.*" />

こんな風にpreview5を使うようにします。

その状態でrestoreしてビルドすると

/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/MAUICameraSetting/Startup.cs(19,6): error CS1061: 'IAppHostBuilder' に 'UseMauiApp' の定義が含まれておらず、型 'IAppHostBuilder' の最初の引数を受け付けるアクセス可能な拡張メソッド 'UseMauiApp' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください [/Users/yamachu/Projects/github.com/yamachu/MAUICameraSetting/MAUICameraSetting/MAUICameraSetting.csproj]

こんな感じでパッケージ内部のnamespaceの変更に巻き込まれるので、Startup.csに

using Microsoft.Maui.Controls.Hosting;

を追加します。

これでビルドが通るようになります。

Windows向けのプロジェクトの修正

後で頑張って書く………

Preview4は

├── MAUICameraSetting.WinUI3
├── MAUICameraSetting.WinUI3\ (Package)

こんな感じで

Preview5だと

├── MAUICameraSetting.WinUI

になって色々変わってるんですよね…これはなんとかしないと。

あとPreview4だと

こんな感じで罠があったけれども、Preview5だとそれが解消されたので楽です。

Crash on startup of WinUI3 C# Project - Basic App Instructions - COMException: Class not registered (0x80040154 (REGDB_E_CLASSNOTREG)) · Issue #848 · microsoft/ProjectReunion · GitHub

わかったきっかけとしてはこれ、難しすぎる。

まとめ

Migration面倒だから、とりあえずPreview5使っておいたほうがいい。

また、これはPreviewの更にPreviewってレベルのやつなので、ちゃんと公式がアナウンスしてから試したほうがいい。はい

他の記事で書くこと

  • VSCodeでNativeAPIの補完を効かせながら開発をするHack
  • Macアプリのデバッグ方法(アタッチは出来ないんだけど…)
  • そもそもiOSMacアプリは.NET 6 preview 6までまともに開発できないかもしれないの話

の3本です、はい

なぜか完全削除が出来なかったmacOS向けのWacomのペンタブドライバを削除する

備忘録

だいぶ昔に使っていたWacomのペンタブがあって使わないからと言ってドライバを削除した記憶がある。 が、最近macOSのアップデートを行ったら f:id:yamachu_co:20210607101640p:plain

読み込みがブロックされたという旨のダイアログが出てきて、ドライバー、消したはずでは!?となったので根こそぎ消していく。

  1. sudo find / '*wacom*' でとりあえず探す

どこにあるのか見当がつかなかったのでこれで一旦探してみます。

/System/Volumes/Data/private/var/db/receipts/com.wacom.PenTabletInstaller.plist
/System/Volumes/Data/private/var/db/receipts/com.wacom.PenTabletInstaller.bom
/private/var/db/receipts/com.wacom.PenTabletInstaller.plist
/private/var/db/receipts/com.wacom.PenTabletInstaller.bom

こんなのが見つかった。 wacomの名前でドライバが転がってるわけではなかったが、とりあえずファイル配置が書いてある .bom ファイルが見つかった。

  1. lsbom を使ってどんなファイルがインストールされたのかを見てみる

いきなり lsbom にたどり着いたわけではないんだけど、lesspipe に突っ込んだら整形されたし file コマンド叩いたら Mac OS X bill of materials (BOM) file って出てきたのでそのあたりぐぐったら lsbom が見つかった。

manには

The lsbom command interprets the contents of binary bom (bom(5)) files. For each file in a bom, lsbom prints the file path and/or requested information.

とあり、bomについて見てみると

File information includes: the file's UNIX permissions, its owner and group, its size, its time of last modification, and so on.

なるほど、インストーラーが何を突っ込んでくるかの構成表なのかってことがわかる。 ってことで使って中身を見てみる。

$ lsbom /System/Volumes/Data/private/var/db/receipts/com.wacom.PenTabletInstaller.plist

.   40755   0/0
./Applications  40755   0/0
./Applications/Pen Tablet.localized 40755   0/0
./Applications/Pen Tablet.localized/.localized  40755   0/0
./Applications/Pen Tablet.localized/.localized/de.strings   100644  0/0 184 965283972
./Applications/Pen Tablet.localized/.localized/en.strings   100644  0/0 156 4126915186
./Applications/Pen Tablet.localized/.localized/es.strings   100644  0/0 180 3855762533
./Applications/Pen Tablet.localized/.localized/fr.strings   100644  0/0 168 2428769691
./Applications/Pen Tablet.localized/.localized/it.strings   100644  0/0 156 1044215362
./Applications/Pen Tablet.localized/.localized/ja.strings   100644  0/0 152 2588287573
./Applications/Pen Tablet.localized/.localized/ko.strings   100644  0/0 132 2731968358
./Applications/Pen Tablet.localized/.localized/nl.strings   100644  0/0 180 1769518410
./Applications/Pen Tablet.localized/.localized/pl.strings   100644  0/0 164 978034193
./Applications/Pen Tablet.localized/.localized/pt.strings   100644  0/0 232 3702078223
./Applications/Pen Tablet.localized/.localized/ru.strings   100644  0/0 256 817618957
./Applications/Pen Tablet.localized/.localized/tr.strings   100644  0/0 156 4126915186
./Applications/Pen Tablet.localized/.localized/zh_CN.strings    100644  0/0 136 1004093214
./Applications/Pen Tablet.localized/.localized/zh_TW.strings    100644  0/0 148 3004780678
./Applications/Pen Tablet.localized/Pen Tablet Utility.app  40755   0/0
(省略)

こんな感じでインストール先が列挙されるので、これを整形していく。 タブ文字区切りなので、cutでdelimiterにタブ文字をセットして…

$  lsbom /System/Volumes/Data/private/var/db/receipts/com.wacom.PenTabletInstaller.bom |cut -d'   ' -f1|sed 's:^.::g'

/Applications/Pen Tablet.localized
/Applications/Pen Tablet.localized/.localized
/Applications/Pen Tablet.localized/.localized/de.strings
/Applications/Pen Tablet.localized/.localized/en.strings
/Applications/Pen Tablet.localized/.localized/es.strings
/Applications/Pen Tablet.localized/.localized/fr.strings
/Applications/Pen Tablet.localized/.localized/it.strings
/Applications/Pen Tablet.localized/.localized/ja.strings
/Applications/Pen Tablet.localized/.localized/ko.strings
/Applications/Pen Tablet.localized/.localized/nl.strings
/Applications/Pen Tablet.localized/.localized/pl.strings
/Applications/Pen Tablet.localized/.localized/pt.strings
/Applications/Pen Tablet.localized/.localized/ru.strings
/Applications/Pen Tablet.localized/.localized/tr.strings
/Applications/Pen Tablet.localized/.localized/zh_CN.strings
/Applications/Pen Tablet.localized/.localized/zh_TW.strings
/Applications/Pen Tablet.localized/Pen Tablet Utility.app
(省略)

こんな感じの出力が出るように。

あとはこいつらでlsして残っているファイルを探していく。

ここで勢い余って rm なんてしないように!!! 普通にトップレベルのディレクトリも存在しているので、その中の対象のファイルだけを消しましょう。

これらを xargs で見ていったら

/Library/Extensions/SiLabsUSBDriver64.kext

こいつが残っていた。

  1. 消す

消せばいいんだけど、日和ったので一旦別ディレクトリに動かした。 とりあえずこれでキレイになっただろう。

今後完全削除したいなと思ったら lsbom を使おうと思う。