路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解

随着 .NET 6.0 的发布 NewLife 组件也进行了升级,并在 2022 年 1 月份全面停止了对 .NET Framework 的支持框架依赖升级至 .NET Standard 2.1 。

2022 年新年到来之际,笔者也打算将路遥工具箱全面迁移至 .NET 6.0 同时发布 3.0 版本。这意味着路遥工具箱将获得更先进的技术和加快的运行速度。

从 .NET Framework 4.6.2 到 .NET 6 的迁移过程

更改目标框架

因为从立项之初就采用了新版本的 csproj 格式,所以迁移过程并不复杂。在项目属性页面中将目标框架从 .NET Framework 4.6.2 更改为 .NET 6.0 之后,大部分工作其实就已经完成了。需要注意的是“目标操作系统版本”和“受支持的 OS 版本”需要设置为 7.0 才可以兼容 Windows 7 操作系统。

移除过时依赖

在 .NET Framework 4.6.2 环境下,路遥工具箱通过引用类库的方式添加了对 System.ComponentModel.DataAnnotations 和 WindowsFormsIntegration 程序集的依赖。在 .NET 6.0 中,这两个程序集已经被默认包含,所以以下代码可以从项目文件中删除:

<ItemGroup><Reference Include="System.ComponentModel.DataAnnotations" /><Reference Include="WindowsFormsIntegration" />
</ItemGroup>

添加对 GB2312 编码的支持

这是一个中文编程环境下绕不过的问题,很纳闷为什么微软没有将其内置。

.NET 6.0 中默认不支持 GB2312、GBK编码。要启用支持需要通过 NuGet 引入 System.Text.Encoding.CodePages ,地址在这里:https://www.nuget.org/packages/System.Text.Encoding.CodePages 。然后在 App 的 OnStartup 方法中调用方法(路遥工具箱是使用 WPF 开发的,并使用了 Prism 框架):

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

UTF8 和 UTF8-without-BOM

UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM。所以不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一下:把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明,这也是微软的习惯)。BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,但这样的文件在 Windows 之外的操作系统里会带来问题。

作者:梁海
链接:https://www.zhihu.com/question/20167122/answer/14194448
来源:知乎

在 .NET 6.0 中,如果使用默认的 UTF-8 编码去写文件则该文件默认是带 BOM 的。因为路遥工具箱的升级接口部署在 Linux 服务器上,所以使用 .NET 6.0 上传的 XML 文件在浏览时会报错。

写文件的代码类似这样:

var str = Serialize(updatePackage);
File.WriteAllText(path, str, Encoding.UTF8);

报错信息:

XML declaration allowed only at the start of the document

解决办法就是采用无 BOM 的 UTF-8 编码,以上代码修改一下即可:

var str = Serialize(updatePackage);
File.WriteAllText(xml, fn, new UTF8Encoding(false));

同时兼容 x86 和 x64 的打包发布

在 .NET 6.0 中,程序的入口 exe 变成了本地化代码。这也就代表着类似 .NET Framework 下那种一个 exe 可以同时适应 x86、x64 的神器操作没有了。

为了能更高效率的发挥路遥工具箱的性能,同时也兼顾目前仍在使用 x86 系统的用户,路遥工具箱采用了 x64 为主且附带 x86 支持的发布形式。

通过 Visual Studio 内置的发布功能将路遥工具箱使用 windows-x86 发布一次,即可得到一个 32 位的入口程序 exe 文件。将该文件改名为 Luyao.Toolkit-x86.exe 后复制到项目中,并设置为“始终复制”。这样每次生成新的 release 版本都是 64 位的并且携带了 32 位的启动器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中main函数解析

作者&#xff1a;xwdreamer出处&#xff1a;http://www.cnblogs.com/xwdreamer欢迎任何形式的转载&#xff0c;但请务必注明出处。从写java至今&#xff0c;写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己&#xff0c;为什么要…

逻辑回归算法原理

http://ihoge.cn/2018/LR.html 逻辑回归模型 逻辑回归也被称为对数几率回归&#xff0c;算法名虽然叫做逻辑回归&#xff0c;但是该算法是分类算法&#xff0c;个人认为这是因为逻辑回归用了和回归类似的方法来解决了分类问题。 逻辑回归模型是一种分类模型&#xff0c;用条…

.net core入门之web应用

2019独角兽企业重金招聘Python工程师标准>>> 其实铺垫了那么久&#xff0c;终于到重点了&#xff0c;迫不及待了吧&#xff0c;那么我们用重量级工具Visual Studio 2015&#xff0c;安装Update3&#xff0c; 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2.exe&…

python里split_python中split()的用法

原博文 2018-10-19 15:15 − Python split() 通过指定分隔符对字符串进行切片&#xff0c;如果参数 num 有指定值&#xff0c;则仅分隔 num 个子字符串。 语法&#xff1a; str.split(str"", numstring.count(str)) str -- 分隔符&#xff0c;默认为所有的空字符&…

C语言条件编译

假如现在要开发一个C语言程序&#xff0c;让它输出红色的文字&#xff0c;并且要求跨平台&#xff0c;在 Windows 和 Linux 下都能运行&#xff0c;怎么办呢&#xff1f;这个程序的难点在于&#xff0c;不同平台下控制文字颜色的代码不一样&#xff0c;我们必须要能够识别出不同…

设计模式之-命令模式(Command Pattern)

命令模式&#xff08;Command Pattern&#xff09;是用来实现在一个请求 - 响应模型松耦合。在命令模式中&#xff0c;请求被发送给调用者和调用它传递给被封装的命令对象。 Command对象将请求传递到接收器的适当的方法来执行特定操作。客户端程序创建接收器对象&#xff0c;然…

android -上传文件到服务器

android上传文件到服务器 重点:最好是设置好content-type这些参数的配置&#xff01; package com.spring.sky.image.upload.network; import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.Inp…

梯度下降法、随机梯度下降法、批量梯度下降法及牛顿法、拟牛顿法、共轭梯度法

http://ihoge.cn/2018/GradientDescent.html http://ihoge.cn/2018/newton1.html 引言 李航老师在《统计学习方法》中将机器学习的三要素总结为&#xff1a;模型、策略和算法。其大致含义如下&#xff1a; 模型&#xff1a;其实就是机器学习训练的过程中所要学习的条件概率…

浅谈.NET 6 中 gRPC 的最新功能

gRPC 是一个现代的、跨平台的、高性能的 RPC 框架。gRPC 是构建在 ASP.NET Core 之上&#xff0c;也是我们推荐的使用 .NET 构建 RPC 服务的方法。.NET 6 进一步提高了 gRPC 已经非常出色的性能&#xff0c;并添加了一系列新功能&#xff0c;使 gRPC 在现代云原生应用程序中比以…

如果你没有时间读书,至少要保留这个习惯

全世界只有3.14 % 的人关注了爆炸吧知识快节奏的生活中&#xff0c;如何花费少量的时间&#xff0c;就可以让自己的生活发生好的改变&#xff1f;知乎上有一个高赞回答&#xff1a;大量阅读优质文章。见识决定了你的眼界&#xff0c;站得越高&#xff0c;看得越多&#xff0c;你…

python引入模块时import与from ... import的区别

import datetime是引入整个datetime包&#xff0c;如果使用datetime包中的datetime类,需要加上模块名的限定。 1 import datetime 2 3 print datetime.datetime.now() 如果不加模块名限定会出现错误&#xff1a;TypeError: module object is not callable \ AttributeError: m…

基于python的随机森林回归实现_随机森林理论与python代码实现

1,初品随机森林 随机森林&#xff0c;森林就是很多决策树放在一起一起叫森林&#xff0c;而随机体现在数据集的随机采样中和特征的随机选取中&#xff0c;具体下面再讲。通俗的说随机森林就是建立多颗决策树&#xff08;CART&#xff09;&#xff0c;来做分类&#xff08;回归&…

Linux之dd命令详解

Linux-dd命令详解 dd 是 Linux/UNIX 下的一个非常有用的命令&#xff0c;作用是用指定大小的块拷贝一个文件&#xff0c;并在拷贝的同时进行指定的转换。 名称: dd 使用权限: 所有使用者dd 这个指令在 manual 里的定义是 convert and copy a file 使用方式: dd [option]…

C++ 标准模板库

转载于:https://www.cnblogs.com/Flyzhcong/p/3977865.html

.NET Conf 2021 回顾

.NET Conf 2021是有史以来规模最大的.NET Conf,全球演讲者举办了80多场会议!我们非常感谢所有收看直播、在分享会上的提问、参与我们的乐趣和游戏的人。学习将持续到1月底&#xff0c;社区活动将持续进行&#xff0c;所以一定要查看这些活动&#xff0c;并关注我们的会议 GitHu…

男厕改女厕能多敷衍......

1 搓澡时最好不要闲聊&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 弟弟需要充电多久才能回家&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 这都什么野史&#xff1f;▼4 脚崴了怎么办&#xff1f;▼5 钥匙在老地方▼6 被红绿灯伤透…

shell之什么时候使用shell以及最简单的shell程序

因为Shell似乎是各UNIX系统之间通用的功能&#xff0c;并且经过了POSIX的标准化。因此&#xff0c;Shell脚本只要“用心写”一次&#xff0c;即可应用到很多系统上。因此&#xff0c;之所以要使用Shell脚本是基于&#xff1a; 简单性&#xff1a;Shell是一个高级语言&#xff…

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)...

最新的效果见 &#xff1a;http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例&#xff1a;视频去雾效果 在图像去雾这个领域&#xff0c;几乎没有人不知道《Single Image Haze Removal Using Dark Channel Prior》这篇文章&#xff0c;该文是2009年C…

python 运算符重载_Python3面向对象-运算符重载

1&#xff1a;运算符重载介绍运算符重载&#xff0c;就是在某个类的方法中&#xff0c;拦截其内置的操作(比如&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/,比较&#xff0c;属性访问&#xff0c;等等)&#xff0c;使其实例的行为接近内置类型。当类的实例出现在内置操…