路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解
隨著 .NET 6.0 的發(fā)布 NewLife 組件也進(jìn)行了升級,并在 2022 年 1 月份全面停止了對 .NET Framework 的支持框架依賴升級至 .NET Standard 2.1 。
2022 年新年到來之際,筆者也打算將路遙工具箱全面遷移至 .NET 6.0 同時(shí)發(fā)布 3.0 版本。這意味著路遙工具箱將獲得更先進(jìn)的技術(shù)和加快的運(yùn)行速度。
從 .NET Framework 4.6.2 到 .NET 6 的遷移過程
更改目標(biāo)框架
因?yàn)閺牧㈨?xiàng)之初就采用了新版本的 csproj 格式,所以遷移過程并不復(fù)雜。在項(xiàng)目屬性頁面中將目標(biāo)框架從 .NET Framework 4.6.2 更改為 .NET 6.0 之后,大部分工作其實(shí)就已經(jīng)完成了。需要注意的是“目標(biāo)操作系統(tǒng)版本”和“受支持的 OS 版本”需要設(shè)置為 7.0 才可以兼容 Windows 7 操作系統(tǒng)。
移除過時(shí)依賴
在 .NET Framework 4.6.2 環(huán)境下,路遙工具箱通過引用類庫的方式添加了對 System.ComponentModel.DataAnnotations 和 WindowsFormsIntegration 程序集的依賴。在 .NET 6.0 中,這兩個(gè)程序集已經(jīng)被默認(rèn)包含,所以以下代碼可以從項(xiàng)目文件中刪除:
<ItemGroup><Reference Include="System.ComponentModel.DataAnnotations" /><Reference Include="WindowsFormsIntegration" /> </ItemGroup>添加對 GB2312 編碼的支持
這是一個(gè)中文編程環(huán)境下繞不過的問題,很納悶為什么微軟沒有將其內(nèi)置。
.NET 6.0 中默認(rèn)不支持 GB2312、GBK編碼。要啟用支持需要通過 NuGet 引入 System.Text.Encoding.CodePages ,地址在這里:https://www.nuget.org/packages/System.Text.Encoding.CodePages 。然后在 App 的 OnStartup 方法中調(diào)用方法(路遙工具箱是使用 WPF 開發(fā)的,并使用了 Prism 框架):
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);UTF8 和 UTF8-without-BOM
UTF-8 不需要 BOM,盡管 Unicode 標(biāo)準(zhǔn)允許在 UTF-8 中使用 BOM。所以不含 BOM 的 UTF-8 才是標(biāo)準(zhǔn)形式,在 UTF-8 文件中放置 BOM 主要是微軟的習(xí)慣(順便提一下:把帶有 BOM 的小端序 UTF-16 稱作「Unicode」而又不詳細(xì)說明,這也是微軟的習(xí)慣)。BOM(byte order mark)是為 UTF-16 和 UTF-32 準(zhǔn)備的,用于標(biāo)記字節(jié)序(byte order)。微軟在 UTF-8 中使用 BOM 是因?yàn)檫@樣可以把 UTF-8 和 ASCII 等編碼明確區(qū)分開,但這樣的文件在 Windows 之外的操作系統(tǒng)里會(huì)帶來問題。
作者:梁海鏈接:https://www.zhihu.com/question/20167122/answer/14194448
來源:知乎
在 .NET 6.0 中,如果使用默認(rèn)的 UTF-8 編碼去寫文件則該文件默認(rèn)是帶 BOM 的。因?yàn)槁愤b工具箱的升級接口部署在 Linux 服務(wù)器上,所以使用 .NET 6.0 上傳的 XML 文件在瀏覽時(shí)會(huì)報(bào)錯(cuò)。
寫文件的代碼類似這樣:
var str = Serialize(updatePackage); File.WriteAllText(path, str, Encoding.UTF8);報(bào)錯(cuò)信息:
XML declaration allowed only at the start of the document解決辦法就是采用無 BOM 的 UTF-8 編碼,以上代碼修改一下即可:
var str = Serialize(updatePackage); File.WriteAllText(xml, fn, new UTF8Encoding(false));同時(shí)兼容 x86 和 x64 的打包發(fā)布
在 .NET 6.0 中,程序的入口 exe 變成了本地化代碼。這也就代表著類似 .NET Framework 下那種一個(gè) exe 可以同時(shí)適應(yīng) x86、x64 的神器操作沒有了。
為了能更高效率的發(fā)揮路遙工具箱的性能,同時(shí)也兼顧目前仍在使用 x86 系統(tǒng)的用戶,路遙工具箱采用了 x64 為主且附帶 x86 支持的發(fā)布形式。
通過 Visual Studio 內(nèi)置的發(fā)布功能將路遙工具箱使用 windows-x86 發(fā)布一次,即可得到一個(gè) 32 位的入口程序 exe 文件。將該文件改名為 Luyao.Toolkit-x86.exe 后復(fù)制到項(xiàng)目中,并設(shè)置為“始終復(fù)制”。這樣每次生成新的 release 版本都是 64 位的并且攜帶了 32 位的啟動(dòng)器。
總結(jié)
以上是生活随笔為你收集整理的路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何计算 string 的 crc32
- 下一篇: 浅谈.NET 6 中 gRPC 的最新功