MAUI Blazor學習20-升級到Net8

SunnyTrudeau發表於2024-11-12

MAUI Blazor學習20-升級到Net8

MAUI Blazor系列目錄

  1. MAUI Blazor學習1-移動客戶端Shell佈局 - SunnyTrudeau - 部落格園 (cnblogs.com)
  2. MAUI Blazor學習2-建立移動客戶端Razor頁面 - SunnyTrudeau - 部落格園 (cnblogs.com)
  3. MAUI Blazor學習3-繪製ECharts圖表 - SunnyTrudeau - 部落格園 (cnblogs.com)
  4. MAUI Blazor學習4-繪製BootstrapBlazor.Chart圖表 - SunnyTrudeau - 部落格園 (cnblogs.com)
  5. MAUI Blazor學習5-BLE低功耗藍芽 - SunnyTrudeau - 部落格園 (cnblogs.com)
  6. MAUI Blazor學習6-掃描二維碼 - SunnyTrudeau - 部落格園 (cnblogs.com)
  7. MAUI Blazor學習7-實現登入跳轉頁面 - SunnyTrudeau - 部落格園 (cnblogs.com)
  8. MAUI Blazor學習8-支援多語言 - SunnyTrudeau - 部落格園 (cnblogs.com)
  9. MAUI Blazor學習9-VS Code開發除錯MAUI入門 - SunnyTrudeau - 部落格園 (cnblogs.com)
  10. MAUI Blazor學習10-BarcodeScanner掃描二維碼 - SunnyTrudeau - 部落格園 (cnblogs.com)
  11. MAUI Blazor學習11-百度地圖定位 - SunnyTrudeau - 部落格園 (cnblogs.com)
  12. MAUI Blazor學習12-檔案另存為 - SunnyTrudeau - 部落格園 (cnblogs.com)
  13. MAUI Blazor學習13-開啟檔案 - SunnyTrudeau - 部落格園 (cnblogs.com)
  14. MAUI Blazor學習14-選擇目錄 - SunnyTrudeau - 部落格園 (cnblogs.com)
  15. MAUI Blazor學習15-採用html2pdf.js生成pdf - SunnyTrudeau - 部落格園 (cnblogs.com)
  16. MAUI Blazor學習16-連續按BACK退出APP - SunnyTrudeau - 部落格園 (cnblogs.com)
  17. MAUI Blazor學習17-NavigationLock阻止頁面回退 - SunnyTrudeau - 部落格園 (cnblogs.com)
  18. MAUI Blazor學習18-自動升級 - SunnyTrudeau - 部落格園
  19. MAUI Blazor學習19-角標(右上角紅點) - SunnyTrudeau - 部落格園

.Net8已經發布一年了,MaBlaApp引用的第三方元件也基本上都提供了支援,決定把解決方案升級到.Net 8。採用NET Upgrade Assistant擴充套件可以簡化升級操作。

升級Maui Blazor專案到.Net 8

VS2022安裝NET Upgrade Assistant擴充套件之後,可以在MaBlaApp專案點選右鍵選單【升級】,一鍵升級專案到.Net 8,非常方便。

升級完成之後,會提示一些錯誤,先不急著解決這些錯誤。把VS2022關掉,把MaBlaApp目錄下的objbin刪除,然後再次開啟專案,確保專案動態生成的檔案都是最新版。

錯誤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.csprojAndroidManifest.xmlSDK版本統一改為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.csprojApplicationDisplayVersion1.0.1改為1.0.0就好了,但是為什麼呢?我在網上也找不到答案。

<ApplicationDisplayVersion>1.0.0</ApplicationDisplayVersion>

後來也做了一些嘗試,比如把<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>註解,僅保留android平臺,也能消除這個錯誤。原因可能是專案配置的androidwindows平臺獲取到的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除錯執行MablaAppAspNetId4Web專案,在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資訊

也順帶測試一下MaBlaAppwindows平臺的執行效果,除錯執行報錯,根據連結去下載安裝一個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

相關文章