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
标签:20,cnblogs,博客园,SunnyTrudeau,Net8,MAUI,Blazor,com From: https://www.cnblogs.com/sunnytrudeau/p/18542764