MAUI Blazor學習20-升級到Net8
MAUI Blazor系列目錄
- MAUI Blazor學習1-移動客戶端Shell佈局 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習2-建立移動客戶端Razor頁面 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習3-繪製ECharts圖表 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習4-繪製BootstrapBlazor.Chart圖表 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習5-BLE低功耗藍芽 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習6-掃描二維碼 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習7-實現登入跳轉頁面 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習8-支援多語言 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習9-VS Code開發除錯MAUI入門 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習10-BarcodeScanner掃描二維碼 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習11-百度地圖定位 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習12-檔案另存為 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習13-開啟檔案 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習14-選擇目錄 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習15-採用html2pdf.js生成pdf - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習16-連續按BACK退出APP - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習17-NavigationLock阻止頁面回退 - SunnyTrudeau - 部落格園 (cnblogs.com)
- MAUI Blazor學習18-自動升級 - SunnyTrudeau - 部落格園
- MAUI Blazor學習19-角標(右上角紅點) - SunnyTrudeau - 部落格園
.Net8已經發布一年了,MaBlaApp引用的第三方元件也基本上都提供了支援,決定把解決方案升級到.Net 8。採用NET Upgrade Assistant擴充套件可以簡化升級操作。
升級Maui Blazor專案到.Net 8
在VS2022安裝NET Upgrade Assistant擴充套件之後,可以在MaBlaApp專案點選右鍵選單【升級】,一鍵升級專案到.Net 8,非常方便。
升級完成之後,會提示一些錯誤,先不急著解決這些錯誤。把VS2022關掉,把MaBlaApp目錄下的obj和bin刪除,然後再次開啟專案,確保專案動態生成的檔案都是最新版。
錯誤1:
AndroidManifest.xml //uses-sdk/@android:minSdkVersion '26' does not match the $(SupportedOSPlatformVersion) value '31.0' in the project file (if there is no $(SupportedOSPlatformVersion) value in the project file, then a default value has been assumed).
Either change the value in the AndroidManifest.xml to match the $(SupportedOSPlatformVersion) value, or remove the value in the AndroidManifest.xml (and add a $(SupportedOSPlatformVersion) value to the project file if it doesn't already exist).
這個根據提示很好解決,把MaBlaApp.csproj和AndroidManifest.xml的SDK版本統一改為28即可。
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">28.0</SupportedOSPlatformVersion>
<uses-sdk android:minSdkVersion="28" android:targetSdkVersion="33" />
錯誤2:
無法讀取“MaBlaApp”的專案資訊: 屬性 PackageVersion 應在所有目標框架中具有單個值,但卻具有以下值: 1.0.0, 1.0.1
這個問題我不知道是什麼原因,我把MaBlaApp.csproj的ApplicationDisplayVersion從1.0.1改為1.0.0就好了,但是為什麼呢?我在網上也找不到答案。
<ApplicationDisplayVersion>1.0.0</ApplicationDisplayVersion>
後來也做了一些嘗試,比如把<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>註解,僅保留android平臺,也能消除這個錯誤。原因可能是專案配置的android和windows平臺獲取到的ApplicationDisplayVersion不同,但是它就一個配置引數。
修改自動升級APP功能
原先使用ApplicationDisplayVersion參與自動升級APP的方案要調整。既然不能透過ApplicationDisplayVersion設定軟體版本資訊,乾脆修改方案,自定義一個軟體版本資訊類
D:\Software\gitee\mauiblazorapp\MaBlaApp\Data\AppVersionInfo.cs
/// <summary> /// 軟體版本資訊 /// </summary> public static class AppVersionInfo { /// <summary> /// 數字版本號,例如2,用於比較,替代csproj專案配置檔案ApplicationVersion /// </summary> public static readonly int NumericVersion = 1; /// <summary> /// 顯示版本號,例如1.0.2,用於顯示,csproj專案配置檔案ApplicationDisplayVersion /// </summary> public static readonly string DisplayVersion = "1.0.1"; }
UpgradeApp頁面顯示改用自定義版本資訊
D:\Software\gitee\mauiblazorapp\MaBlaApp\Pages\UpgradeApp.razor
<li class="list-group-item d-flex justify-content-between"> <strong>當前顯示版本</strong> <small>@AppVersionInfo.DisplayVersion</small> </li> <li class="list-group-item d-flex justify-content-between"> <strong>當前數字版本</strong> <small>@AppVersionInfo.NumericVersion</small> </li>
UpgradeAppService檢查升級也改用自定義版本資訊
D:\Software\gitee\mauiblazorapp\MaBlaApp\Platforms\Android\UpgradeAppService.cs
public async Task<(AppFileInfo?, string Msg)> CheckNewVersionAsync(string appName) //var currentVersion = int.Parse(AppInfo.BuildString); //改用自定義AppVersionInfo var currentVersion = AppVersionInfo.NumericVersion;
重新生成專案,除錯執行,功能正常。
手動升級第三方元件庫
透過git的差異對比功能,可以瞭解一下檔案的修改點。發現MaBlaApp.csproj新增了幾行程式碼,升級了Microsoft的幾個元件庫,其他第三方元件庫都沒有升級。另外幾個被修改的檔案,主要新增了maui的名稱空間,實際上並沒有使用,我後來把這些多餘的修改撤銷了。結合新建MAUI Bazor專案程式碼,比較重要的是這幾行:
<PackageReference Include="Microsoft.AspNetCore.Components.WebView.Maui" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
透過NuGet把第三方元件庫全部升級到最新版。大部分元件庫升級後完全向前相容,個別函式和屬性小改一下,根據編譯報錯很好解決。
第三方元件庫 |
舊版 |
新版 |
備註 |
BarcodeScanner.Mobile.Maui |
7.0.0.1-pre |
8.0.0 |
個別類屬性修改,最新版8.0.40.1有編譯錯誤 |
CommunityToolkit.Maui |
6.1.0 |
9.1.0 |
|
IdentityModel |
4.6.0 |
/ |
不升級 |
Microsoft.Extensions.Http |
7.0.0 |
8.0.1 |
|
Plugin.BLE |
3.0.0-beta.2 |
3.1.0 |
個別函式介面修改 |
System.IdentityModel.Tokens.Jwt |
6.25.0 |
8.2.0 |
|
ZXingBlazor |
0.2.7 |
1.1.5 |
比較難搞的是BarcodeScanner.Mobile.Maui,升級到最新版8.0.40.1,編譯報錯。從錯誤資訊看,好像是內部重複定義了一個檔案。我發現它跟CommunityToolkit.Maui最新版有關聯,如果不升級CommunityToolkit.Maui就不會報錯。後來我找到了一個辦法,BarcodeScanner.Mobile.Maui只升級到8.0.0版,編譯透過,測試掃碼功能正常。
2>MSBUILD : java.exe error JAVA0000: Error in obj\Debug\net8.0-android\lp\140\jl\classes.jar:androidx/activity/ActivityViewModelLazyKt$viewModels$1.class:
2>MSBUILD : java.exe error JAVA0000: Type androidx.activity.ActivityViewModelLazyKt$viewModels$1 is defined multiple times: obj\Debug\net8.0-android\lp\140\jl\classes.jar:androidx/activity/ActivityViewModelLazyKt$viewModels$1.class, obj\Debug\net8.0-android\lp\174\jl\classes.jar:androidx/activity/ActivityViewModelLazyKt$viewModels$1.class
2>MSBUILD : java.exe error JAVA0000: Compilation failed
2>MSBUILD : java.exe error JAVA0000: java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj\Debug\net8.0-android\lp\140\jl\classes.jar
2>MSBUILD : java.exe error JAVA0000: androidx/activity/ActivityViewModelLazyKt$viewModels$1.class
升級Identity Server 4專案到.Net 8
Identity Server 4早已經停止維護,後續版本改為商業收費版。NET Upgrade Assistant自動升級的時候,提示有一些元件庫無法升級。
如果不升級第三方元件庫的話,執行會報錯:
System.MissingMethodException: Method not found: 'Boolean Microsoft.EntityFrameworkCore.Migrations.IMigrationsModelDiffer.HasDifferences(Microsoft.EntityFrameworkCore.Metadata.IModel, Microsoft.EntityFrameworkCore.Metadata.IModel)'.
透過NuGet把第三方元件庫全部升級到最新版。
第三方元件庫 |
舊版 |
新版 |
IdentityServer4.AspNetIdentity |
4.0.0 |
4.1.2 |
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore |
3.1.5 |
8.0.10 |
Microsoft.EntityFrameworkCore.Tools |
3.1.5 |
8.0.10 |
Microsoft.AspNetCore.Identity.UI |
3.1.5 |
8.0.10 |
Serilog.AspNetCore |
3.2.0 |
8.0.3 |
升級第三方元件庫之後,可以正常執行了。
測試
在VS2022除錯執行MablaApp、AspNetId4Web專案,在MablaApp點選登入報錯,無法訪問認證伺服器。
[0:] System.Net.Http.HttpClient.Ids4Client.ClientHandler: Information: Sending HTTP request GET http://10.0.2.2:5000/api/PhoneCodeLogin/SendPhoneCode?phoneNumber=13512345001
**System.Net.Http.HttpRequestException:** 'Connection failure'
修改MablaApp訪問認證伺服器https埠,取消檢查SSL證書
builder.Services.AddHttpClient<Ids4Client>()
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
ServerCertificateCustomValidationCallback = delegate { return true; }//忽略https證書檢查
})
//.ConfigureHttpClient(c => c.BaseAddress = new Uri("http://localhost:5000"));//Windows除錯
.ConfigureHttpClient(c => c.BaseAddress = new Uri("https://10.0.2.2:5001"));//安卓模擬器,AndroidManifest.xml要新增android:usesCleartextTraffic="true"支援訪問http網站
測試登入成功。AspNetId4Web日誌正常:
[22:58:38 Information] IdentityServer4.Validation.TokenRequestValidator
Token request validation success, {"ClientId": "PhoneCode", "ClientName": "PhoneCode", "GrantType": "PhoneCodeGrantType", "Scopes": "openid profile role scope1", "AuthorizationCode": "********", "RefreshToken": "********", "UserName": null, "AuthenticationContextReferenceClasses": null, "Tenant": null, "IdP": null, "Raw": {"client_Id": "PhoneCode", "client_secret": "***REDACTED***", "grant_type": "PhoneCodeGrantType", "scope": "openid profile scope1 role", "PhoneNumber": "13512345001", "VerificationCode": "9978"}, "$type": "TokenRequestValidationLog"}
[22:58:38 Debug] IdentityServer4.Services.DefaultClaimsService
Getting claims for access token for client: PhoneCode
[22:58:38 Debug] IdentityServer4.Services.DefaultClaimsService
Getting claims for access token for subject: d2f64bb2-789a-4546-9107-547fcb9cdfce
[22:58:38 Information] IdentityServer4.Events.DefaultEventService
{"ClientId": "PhoneCode", "ClientName": "PhoneCode", "RedirectUri": null, "Endpoint": "Token", "SubjectId": "d2f64bb2-789a-4546-9107-547fcb9cdfce", "Scopes": "openid profile role scope1", "GrantType": "PhoneCodeGrantType", "Tokens": [{"TokenType": "access_token", "TokenValue": "****0RVQ", "$type": "Token"}], "Category": "Token", "Name": "Token Issued Success", "EventType": "Success", "Id": 2000, "Message": null, "ActivityId": "0HN800N10AB7V:00000001", "TimeStamp": "2024-11-08T14:58:38.0000000Z", "ProcessId": 2000, "LocalIpAddress": "127.0.0.1:5001", "RemoteIpAddress": "127.0.0.1", "$type": "TokenIssuedSuccessEvent"}
[22:58:38 Debug] IdentityServer4.Endpoints.TokenEndpoint
Token request success.
MablaApp可以顯示獲取的access token資訊
也順帶測試一下MaBlaApp在windows平臺的執行效果,除錯執行報錯,根據連結去下載安裝一個SDK也不行。
DEP0840: 專案“MaBlaApp”需要版本 >= "5001.178.1908.0" 的包 "MicrosoftCorporationII.WinAppRuntime.Main.1.5_8wekyb3d8bbwe" 和 "MicrosoftCorporationII.WinAppRuntime.Singleton_8wekyb3d8bbwe"。應該在首次執行時安裝這些包,如果未安裝,請訪問 http://go.microsoft.com/fwlink/?linkid=2222757 以獲取安裝說明。
參考微軟官網的說明,取消MSIX打包,就好了。
https://learn.microsoft.com/zh-cn/dotnet/maui/windows/setup?view=net-maui-8.0
在“解決方案資源管理器”中,右鍵單擊 .NET MAUI 應用專案,然後選擇“屬性”。 然後,導航到“應用程式 > Windows 目標”選項卡,並確保未選中“建立 Windows MSIX 包”:
MaBlaApp專案配置增加WindowsPackageType
D:\Software\gitee\mauiblazorapp\MaBlaApp\MaBlaApp.csproj
<WindowsPackageType>None</WindowsPackageType>
D:\Software\gitee\mauiblazorapp\MaBlaApp\Properties\launchSettings.json
{
"profiles": {
"Windows Machine": {
"commandName": "Project",
"nativeDebugging": false
}
}
}
然後可以除錯執行了。
遺留問題
Identity Server 4已經停止維護,其引用的第三方元件庫在編譯的時候也會提示有漏洞。包 "Newtonsoft.Json" 11.0.2 具有已知的 高 嚴重性漏洞,https://github.com/advisories/GHSA-5crp-9r3c-p9vr。要找一個免費,開源的替代方案。
DEMO程式碼地址:https://gitee.com/woodsun/mauiblazorapp