随笔 - 59  文章 - 20  评论 - 61  阅读 - 84871

MAUI Blazor学习20-升级到Net8

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

 

posted on   SunnyTrudeau  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示