首页 > 其他分享 >MAUI Blazor学习20-升级到Net8

MAUI Blazor学习20-升级到Net8

时间:2024-11-12 22:22:09浏览次数:1  
标签:20 cnblogs 博客园 SunnyTrudeau Net8 MAUI Blazor com

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目录下的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

相关文章

  • 河南工大2024新生周赛(3)——命题人:张宏泽
    A.这是一道签到题题目的背景是基于简单的博弈论Nim游戏,但细心者可以发现小明和小美的名字的首字母一致,所以只需要进行读入,直接输出"XM"即可通过本题#include<stdio.h>intn,x;voidsolve(){ scanf("%d",&n); for(inti=1;i<=n;i++)scanf("%d",&x); puts("X......
  • 【大语言模型】ACL2024论文-09 无监督信息精细化训练用于增强大型语言模型的检索增强
    【大语言模型】ACL2024论文-09无监督信息精细化训练用于增强大型语言模型的检索增强生成目录文章目录【大语言模型】ACL2024论文-09无监督信息精细化训练用于增强大型语言模型的检索增强生成目录1.论文信息2.摘要3.研究背景4.问题与挑战5.如何解决6.创新点7.......
  • CCPC(2024年中国大学生程序设计竞赛女生专场)
    #include<bits/stdc++.h>#defineendl'\n'#defineintllusingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdi......
  • 盒子(2024年中国大学生程序设计竞赛女生专场)
    #include<bits/stdc++.h>#defineendl'\n'#defineintllusingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdi......
  • 2024大模型典型示范应用案例集——附219页PDF
    2024年是大模型深入赋能千行百业,融入实体经济,助力科技创新的一年。截至今年5月,我国国产大模型的数量已经超过300个,预示着大模型在各行业场景的创新应用和深度拓展,对培育新质生产力、高水平赋能新型工业化、推动高质量发展发挥了重要作用。今年,国务院政府工作报告首次提出......
  • [极客大挑战 2019]Upload
    直接上传shell.php,发现提示不是图片,这时先修改后缀名或者Content-Type数。我们使用burpsuite进行操作抓包后发送到repeater,直接修改后缀名不行,看来是通过Content-Type属性来判断是否为图片的,将Content-Type修改为image/jpeg,回显not!php!将文件后缀名修改为phtml,回显包含了<?......
  • 多校A层冲刺NOIP2024模拟赛21
    以为150要垫底了,没想到还有高手。送信卒签,没一会就写完但因为交的太晚被猫娘抢了首A。恼火。简要题意给一个\(n\timesm(n,m\le100)\)的网格图,左右走的代价为\(1\),上下走的代价为\(k\),求最小的\(k\),使得\((sx,sy)\)到\((tx,ty)\)的代价恰好为\(s(s\le10^5)\)。数据保证有解......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛21
    Rank别样的,不好评价,烂完了A.送信卒签,我是唐氏。为什么呢题目没给最短路的定义,我赛时觉得最短路就是最短路径,于是直接bfs一遍随便加个check就做完了。当然过得那遍按我的思路来说是错的,然后我也发现了这一点,然后就改了,然后就WA了。总结:错误思路的错解是正确思路......
  • [极客大挑战 2019]Http
    打开页面如下:主页没有什么信息,直接查看网页源代码,查找href看看有没有链接,发现Secret.php访问得到,Itdoesn'tcomefrom'https://Sycsecret.buuoj.cn',我们知道这需要修改referer。使用burpsuite抓包抓包后,转发到repeater,添加referer属性,send访问,发现要求使用'Syclover'浏览......
  • 2024年最新优化算法:海市蜃楼算法(Fata Morgana Algorithm ,FATA)介绍
    海市蜃楼算法(FataMorganaAlgorithm,FATA)是2024年提出一种新型的群体智能优化算法,它的设计灵感来源于自然现象中的海市蜃楼形成过程。FATA算法通过模仿光线在不均匀介质中的传播方式,提出了两种核心策略——海市蜃楼光过滤原则(MLF)和光传播策略(LPS)——来优化搜索过程,增强算法......