升级到 .NET 8

Update to .NET 8

Intro

.NET 8 正式版发布已有一周多了,有些应用已经升级了 .NET 8,有些有依赖 Roslyn 的 package,最近才更新,所以有部分刚升级,分享一下升级到 .NET 8 的过程,相对比较简单,仅供参考

TargetFramework Update

首先要更新的就是项目文件里的 TargetFrameworknet8.0,然后 .NET 相关的 package 更新到 8.0.0 版本,对于某些非常简单的应用来说可能就足够了,完~

项目较多把 TargetFramework 可以放在一个 Directory.Build.props 中,移除项目文件里的,这样可能更新一行代码就可以了

4dfd9d26cc79e62684ac966b81427405.png

再看些复杂一些的

.NET 8 SDK 默认包含了 source link,所以之前项目里引用了 Microsoft.SourceLink.GitHub 升级之后可以去掉了,SDK 里默认包含了,.NET 8 里默认支持 source link,无需做任何改动

默认支持

  • GitHub or GitHub Enterprise

  • Azure Repos git repositories (formerly known as Visual Studio Team Services)

  • GitLab 12.0+ (for older versions see GitLab settings)

  • Bitbucket 4.7+ (for older versions see Bitbucket settings)

可以参考:https://github.com/dotnet/sourcelink/#using-source-link-in-net-projects

另外从 .NET 8 开始默认的 dotnet packdotnet publish 会使用 Release 模式,而非之前的 Debug 模式,对于之前手动指定 -c Release 的命令可以简化一下,可以不用指定,不过不更新也不会有问题~~

CI Update

目前用的 CI 主要是 Azure DevOps 和 Github Actions

Azure DevOps

- task: UseDotNet@2
      displayName: 'Use .NET sdk'
      inputs:
        packageType: sdk
-       version: 7.0.x
+       version: 8.0.x

更新 SDK version 到 8.0.x 或者 8.x 可以自动获取最近的 .NET 8 的 SDK

Github Actions

- name: Setup .NET SDK
      uses: actions/setup-dotnet@v3
      with:
-        dotnet-version: 7.0.x
+        dotnet-version: 8.0.x

如果你的项目是多个 target framework 的,常见的是一些类库应用,可能是增加了 .NET 8 的 sdk,可以同时指定多个版本,示例如下:

- name: Setup .NET SDK
  uses: actions/setup-dotnet@v3
  with:
    dotnet-version: |
      6.0.x
      8.0.x

Container Update

更新 docker image tag 为 8.0

- FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
+ FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

+ ENV ASPNETCORE_HTTP_PORTS=80

- FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
+ FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env

这里中间有一个 ASPNETCORE_HTTP_PORTS 环境变量的配置,因为 .NET 8 container 里默认的端口号变成了 8080,可以设置这一环境变量以保持使用 80 端口,这样可以不需要修改 k8s 里的 deployment 和 service 的端口配置

引入这一变化的原因在于,dotnet team 想要支持 non-root user,而 80 端口需要高级权限,所以默认端口号改成了 8080 普通用户也可以使用这一端口号,另外在 8.0 的 container 中引入了一个新的 user app 没有 root 权限

可以参考微软的 Dockerfile: https://github.com/dotnet/dotnet-docker/blob/2e4b5915486c96b4e5f7d49b01a767301f661790/src/runtime-deps/8.0/jammy/amd64/Dockerfile#L3

如果想要使用 8080 端口和 non-root user 的话,可以在 Dockerfile 中在 runtime image 中添加

USER app

即可启用 non-root user,需要注意的是如果启用 non-root user, 权限将会收紧,将无法在 container 里通过命令去安装新的 package

453ce968919fdc35cc6024a7b53dd854.png

对于我们常用的一些工具如 curl 等如果需要建议在 Dockerfile 中增加一个 step 去安装

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        curl \
        git \
    && rm -rf /var/lib/apt/lists/*
    
USER app

另外就是前面提到的 container 的 port 变成了 8080,需要修改别的服务调用的地址或者 k8s resource 中 container port

如果是一个全新的服务,建议使用 8080 端口并且启用 app 用户,老的服务可以根据自己的需要进行调整

WPF Update

除了前面提到的框架版本和包版本的更新之外,在之前的版本中想要使用选择文件或者目录窗体的话在 WPF 中需要引用 Winform 的窗体,需要在项目文件中指定 <UseWindowsForms>true</UseWindowsForms> 并使用 System.Windows.Forms.FolderBrowserDialog

.NET 8 开始引入了 WPF 中的文件对话框,可以不再需要引用 winform 中的组件了

.NET 8 之前的代码如下:

var dialog = new System.Windows.Forms.FolderBrowserDialog
{
    Description = _localizer["ChooseDirTip"],
    ShowNewFolderButton = true
};
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    return dialog.SelectedPath;
}

更新到 .NET 8 之后的代码如下:

var dialog = new OpenFolderDialog()
{
    Title = _localizer["ChooseDirTip"]
};
if (dialog.ShowDialog() == true)
{
    return dialog.FolderName;
}

项目文件中的  <UseWindowsForms>true</UseWindowsForms> 也移除了,可以参考 commit:

https://github.com/WeihanLi/DbTool/commit/3f6e1f99c9ac948c72afe21fd4abe95af8b9a382

More

你在升级 .NET 8 的过程中有没有遇到什么问题呢?一起来分享一下吧~~

References

  • https://github.com/WeihanLi/DbTool.Packages/pull/8/files

  • https://github.com/night-moon-studio/NatashaPad/pull/18

  • https://github.com/WeihanLi/WeihanLi.Extensions.Localization.Json/pull/5

  • https://github.com/WeihanLi/DbTool/commit/3f6e1f99c9ac948c72afe21fd4abe95af8b9a382

  • https://github.com/OpenReservation/ReservationServer/commit/6c649e690133885b80cd6474a6c39a693c056308

  • https://github.com/OpenReservation/ReservationServer/commit/cdf4e54fa255a115539f4b04b2b17e919202030f

  • https://github.com/WeihanLi/XunitDependencyInjection.Samples/commit/7fa7534b35c2404adb41b6c3f4da183df080bb59

  • https://github.com/dotnet/dotnet-docker/blob/2e4b5915486c96b4e5f7d49b01a767301f661790/src/runtime-deps/8.0/jammy/amd64/Dockerfile#L3

  • https://devblogs.microsoft.com/dotnet/announcing-dotnet-chiseled-containers/

  • https://github.com/dotnet/sourcelink/#using-source-link-in-net-projects

  • https://learn.microsoft.com/en-us/dotnet/core/compatibility/8.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VB(Visual Basic)是一种基于事件驱动的编程语言,广泛应用于Windows应用程序开发。而VB.NET(Visual Basic .NET)是VB的升级版,它是微软推出的一种面向对象的编程语言。 VB.NET相较于VB具有许多优点和改进。首先,VB.NET支持更强大的面向对象编程(OOP)特性,如继承、封装、多态等。这使得开发者能够更好地组织和管理代码,提高代码的可重用性和维护性。 其次,VB.NET引入了新的语言特性,如命名空间(Namespace)和属性(Property),使得代码更加清晰易懂。此外,VB.NET还提供了更多的内置类库和框架,方便开发者进行各种操作,如文件访问、网络通信等。 另外,VB.NET支持更广泛的平台和技术。它可以用于开发桌面应用程序、Web应用程序,甚至是移动应用程序(使用Xamarin技术)。通过使用.NET平台,VB.NET还可以与其他语言进行交互,如C#、F#等,实现更灵活的开发方式。 最后,VB.NET提供了强大的调试和错误处理功能,使开发者能够更轻松地定位和修复错误,提高开发效率。 尽管VB.NET是VB的升级版,但需要注意的是,它不完全向下兼容。VB.NET引入了一些新的语法和规则,需要开发者进行学习和适应。然而,对于熟悉VB的开发者来说,学习VB.NET并不会太难,并且会为他们提供更多的开发机会和挑战。 综上所述,VB.NET是VB的升级版,它带来了更强大的面向对象编程特性、新的语言特性、更广泛的平台支持和强大的调试功能。对于开发者来说,学习和使用VB.NET将使他们能够更好地开发高质量和高效率的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值