.NET Framework 4.8发布

原文地址:https://devblogs.microsoft.com/dotnet/announcing-the-net-framework-4-8/

我们很高兴地宣布今天发布.NET Framework 4.8。它包含在Windows 10 May 2019更新中。.NET Framework 4.8也可在Windows 7+和Windows Server 2008 R2 +上使用。

您可以从我们的 .NET下载站点安装.NET 4.8 。要构建面向.NET Framework 4.8的应用程序,可以下载.NET 4.8开发人员包如果您只想要.NET 4.8运行时,可以尝试:

  • .NET 4.8 Web安装程序 - 在安装期间需要Internet连接

  • .NET 4.8脱机安装程序 - 可以在以后以断开连接状态下载和安装

.NET Framework 4.8包含更新的工具集以及几个方面的改进:

  • [运行时]  JIT和NGEN改进

  • [BCL]  更新了ZLib

  • [BCL]  降低FIPS对密码学的影响

  • [WinForms]  辅助功能增强功能

  • [WCF]  服务行为增强功能

  • [WPF]  高DPI增强,UIAutomation改进

您可以在.NET Framework 4.8发行说明中看到完整的改进列表  。.NET 4.8也更新了参考源。

 支持的Windows版本

Windows客户端版本:Windows 10版本1903,Windows 10版本1809,Windows 10版本1803,Windows 10版本1709,Windows 10版本1703,Windows 10版本1607,Windows 8.1,Windows 7 SP1
Windows Server版本:Windows Server 2019,Windows Server版本1803,Windows Server 2016,Windows Server 2012,Windows Server 2012 R2,Windows Server 2008 R2 SP1

 .NET Framework 4.8中的新功能

运行时 - JIT改进

.NET 4.8中的JIT基于.NET Core 2.1。现在,.NET Framework中提供了所有错误修复和.NET Core 2.1中许多基于代码生成的性能优化。

运行时 - NGEN的改进

.NET Framework中的NGEN映像不再包含可写和可执行部分。这减少了可用于通过修改将要执行的内存来执行任意代码的攻击的表面区域。

虽然在运行时内存中仍然存在可写和可执行数据,但此更改会删除从NGEN映像映射的数据,从而允许它们在不允许图像中的可执行/可写部分的受限环境中运行。

运行时 - 所有程序集的反恶意软件扫描

在以前版本的.NET Framework中,Windows Defender或第三方反恶意软件会自动扫描从磁盘加载的所有程序集以查找恶意软件。但是,从其他地方加载的程序集(例如使用Assembly.Load(byte []))将不会被扫描,并且可能会检测到未检测到的病毒。

Windows 10上的.NET Framework 4.8会触发Windows Defender和许多其他实现反恶意软件扫描接口的反恶意软件解决方案对这些程序集的扫描。我们希望这会使恶意软件更难以在.NET程序中伪装自己。

BCL - 更新了ZLib

从.NET Framework 4.5开始,我们使用 clrcompression.dll中http://zlib.net的ZLib本机版本(用于数据压缩的本机外部压缩库)  ,以便为deflate算法提供实现。在.NET Framework 4.8中,我们将clrcompression.dll更新为使用版本1.2.11,其中包括几个关键的改进和修复。

BCL - 降低FIPS对密码学的影响

.NET Framework 2.0+具有加密提供程序类,例如SHA256Managed,当在“FIPS模式”下配置系统加密库时会抛出CryptographicException。抛出这些异常是因为托管版本未经过FIPS(联邦信息处理标准)140-2认证(JIT和NGEN映像生成都会使证书无效),这与系统加密库不同。很少有开发人员将他们的开发机器置于“FIPS模式”,导致这些异常在生产(或客户系统)中引发。.NET Framework还使用“FIPS模式”设置来阻止加密算法,这些加密算法不被FIPS规则视为已批准的算法。

对于为.NET Framework 4.8构建的应用程序,将不再抛出这些异常(默认情况下)。相反,SHA256Managed类(以及其他托管加密类)会将加密操作重定向到系统加密库。此策略更改有效地消除了开发人员环境与运行代码的生产环境之间可能存在的混淆差异,并使本机组件和托管组件在相同的加密策略下运行。

针对.NET Framework 4.8的应用程序将自动切换到较新的宽松策略,并且在“FIPS模式”下不再会看到从MD5Cng,MD5CryptoServiceProvider,RC2CryptoServiceProvider,RIPEMD160Managed和RijndaelManaged引发的异常。依赖于先前版本的异常的应用程序可以通过将AppContext开关“Switch.System.Security.Cryptography.UseLegacyFipsThrow”设置为“true”来返回到先前的行为。

Windows窗体 - 辅助功能增强功能

在.NET Framework 4.8中,WinForms添加了三个新功能,使开发人员能够编写更易于访问的应用程序。添加的功能旨在使视障用户的应用程序数据通信更加健壮。当用户通过键盘导航时,我们添加了对ToolTips的支持,我们已将LiveRegions和Notification Events添加到许多常用控件中。

要启用这些功能,您的应用程序需要在App.config文件中启用以下AppContextSwitches:

Windows窗体 - UIA LiveRegions支持标签和StatusStrips

UIA Live Regions允许应用程序开发人员通知屏幕阅读器控件的文本更改,该控件位于用户工作的位置之外。这将派上用场的示例可以是显示连接状态的StatusStrip。如果删除连接并且状态发生更改,开发人员可能希望通知屏幕阅读器此更改。Windows Forms已为Label控件和StatusStrip控件实现了UIA LiveRegions。

在Label控件中使用LiveRegion的示例:

讲述者现在将宣布“准备就绪”,无论用户在何处与应用程序进行交互。
您还可以将UserControl实现为Live区域:

Windows窗体 - UIA通知事件

在Windows 10 Fall Creators Update中,Windows引入了一种新方法,让应用程序通知Narrator内容已更改,而Narrator应该宣布更改。UIA通知事件为您的应用程序提供了一种方式来引发UIA事件,这会导致讲述人根据您为事件提供的文本简单地发布通知,而无需在UI中使用相应的控件。在某些情况下,这可能是一种直接提高应用程序可访问性的方法。有关UIA通知事件的更多信息,请参阅此博客文章。

通知可能派上用场的一个示例是通知可能需要一些时间的某个过程的进度。

提升通知事件的示例:

Windows窗体 - 键盘访问的工具提示

目前,只能通过将鼠标指针移动到控件中来触发控制工具提示。此新功能使键盘用户可以通过使用Tab键或带有或不带修饰键的箭头键来聚焦控件来触发控件的工具提示。此特定辅助功能增强需要额外的AppContextSwitch,如以下示例所示:

  1.创建一个新的WinForms应用程序。

  2.将以下XML添加到App.config文件中。

  3.将几个按钮和一个ToolTip控件添加到应用程序的表单中。

  4.设置按钮的工具提示。

  5.运行应用程序并使用键盘在按钮之间导航:

640?wx_fmt=png

Windows窗体 - DataGridView控制可访问的层次结构更改

目前,可访问的层次结构(UI自动化树)将编辑框树元素显示为当前编辑的单元格的子元素,但不显示为DataGridView的根子元素。可以使用Inspect工具观察层次结构树更新:

640?wx_fmt=png

 WCF - ServiceHealthBehavior

健康端点具有许多优点,并且编排工具广泛使用它来根据服务健康状况管理服务。监控工具还可以使用运行状况检查来跟踪和警告服务的可用性和性能,并将其作为早期问题指标。

ServiceHealthBehavior是一种扩展IServiceBehavior的WCF服务行为。添加到ServiceDescription.Behaviors集合后,它将启用以下内容:

  • 使用HTTP响应代码返回服务运行状况:可以在查询字符串中指定HTTP / GET运行状况探测请求的HTTP状态代码。

  • 发布服务运行状况:使用“?运行状况”查询字符串,使用HTTP / GET请求显示服务特定的详细信息,包括服务状态和节流计数和容量。在故障排除错误行为的WCF服务时,了解并轻松访问所显示的信息非常重要。

配置ServiceHealthBehavior:

有两种方法可以公开运行状况端点并发布WCF服务运行状况信息:使用代码或使用配置文件。

  1. 使用代码启用运行状况端点 

  1. 使用config启用健康端点

使用HTTP响应代码返回服务运行状况:

可以通过查询参数(OnServiceFailure,OnDispatcherFailure,OnListenerFailure,OnThrottlePercentExceeded)查询运行状况。可以为每个查询参数指定HTTP响应代码(200 - 599)。如果省略查询参数的HTTP响应代码,则默认使用503 HTTP响应代码。

查询参数和示例:

  1. OnServiceFailure:

  • 示例:通过查询https:// contoso:81 / Service1?health&OnServiceFailure = 450,当ServiceHost.State大于CommunicationState.Opened时,将返回450 HTTP响应状态代码。

  1. OnDispatcherFailure:

  • 示例:通过查询https:// contoso:81 / Service1?health&OnDispatcherFailure = 45 5,当任何通道调度程序的状态大于CommunicationState.Opened时,将返回455 HTTP响应状态代码。

  1. OnListenerFailure:

  • 示例:通过查询https:// contoso:81 / Service1?health&OnListenerFailure = 4 65,当任何通道侦听器的状态大于CommunicationState.Opened时,将返回465 HTTP响应状态代码。

  1. OnThrottlePercentExceeded:指定触发响应的百分比{1 - 100}及其HTTP响应代码{200 - 599}。

  • 示例:通过查询https:// contoso:81 / Service1?health&OnThrottlePercentExceeded = 70:350,95:500,当节流百分比等于或大于95%时,返回500响应代码; 当百分比等于或大于70%且小于95%时,返回350; 否则,返回200。

出版服务健康状况:

启用运行状况端点后,可以在html中显示服务运行状况(通过指定查询字符串:https:// contoso:81 / Service1?运行状况)或xml(通过指定查询字符串:https:// contoso:81 / Service1?health&Xml)格式。https:// contoso:81 / Service1?health&NoContent返回空的html页面。

注意:

始终限制对服务运行状况终结点的访问是最佳做法。您可以使用以下机制限制访问:

  1. 为健康端点使用不同于其他服务的端口,并使用防火墙规则来控制访问。

  2. 将所需的身份验证和授权添加到运行状况端点绑定。

WPF - 屏幕旁白者不再宣布具有折叠或隐藏可见性的元素

屏幕阅读器不再宣布具有折叠或隐藏可见性的元素。如果向用户宣布这些元素,则包含具有折叠或隐藏可见性的元素的用户界面可能被屏幕阅读器误传。在.NET Framework 4.8中,WPF不再包含UIAutomation树的Control View中的Collapsed或Hidden元素,因此屏幕阅读器无法再宣布这些元素。

WPF - SelectionTextBrush属性,用于非基于Adorner的文本选择

在.NET Framework 4.7.2中,WPF添加了在不使用adorner层的情况下绘制TextBox和PasswordBox文本选择的功能(参见此处)。此场景中所选文本的前景色由SystemColors.HighlightTextBrush决定。

在.NET Framework 4.8中,我们添加了一个新属性SelectionTextBrush,允许开发人员在使用基于非装饰器的文本选择时为所选文本选择特定画笔。

此属性仅适用于启用了基于非装饰器的文本选择的WPF应用程序中的TextBoxBase派生控件和PasswordBox。它不适用于RichTextBox。如果未启用基于非装饰器的文本选择,则会忽略此属性。

要使用此属性,只需将其添加到XAML代码并使用适当的画笔或绑定。

生成的文本选择如下所示:

640?wx_fmt=png

您可以结合使用SelectionBrush和SelectionTextBrush来生成您认为合适的背景和前景的任何颜色组合。

WPF - 高DPI增强功能

WPF在.NET 4.8中增加了对Per-Monitor V2 DPI感知和混合模式DPI扩展的支持。有关这些Windows概念的更多信息,请参见此处。

WPF中最新的Per监视器应用程序开发指南指出,只有纯WPF应用程序可以在高DPI WPF应用程序中无缝工作,并且不完全支持Hosted HWND和Windows Forms控件。

.NET 4.8改进了对支持混合模式DPI扩展的平台上的高DPI WPF应用程序中托管HWND和Windows Forms互操作的支持(Windows 10 v1803)。当托管HWND或Windows窗体控件创建为混合模式DPI缩放窗口时(如“ 混合模式DPI缩放和DPI感知API ”文档中所述,通过调用SetThreadDpiHostingBehavior和SetThreadDpiAwarenessContext API),可以托管此类Per-Monitor V2 WPF应用程序中的内容,并对它们进行适当调整大小和缩放。此类托管内容不会在本机DPI上呈现 - 相反,操作系统会将托管内容扩展到适当的大小。

对Per-Monitor v2 DPI感知模式的支持还允许在高DPI应用程序的本机窗口下托管(即,父级)WPF控件。Windows 10 v1607(周年纪念更新)将提供Per-Monitor V2 DPI Awareness支持。当通过应用程序清单启用Per-Monitor V2 DPI Awareness模式时,Windows添加了对child-HWND的支持以接收DPI更改通知。

WPF利用此支持来确保在本机窗口下托管的控件可以响应DPI更改并自行更新。例如,在Windows窗体中托管的WPF控件或表现为Per Monitor V2的Win32应用程序 - 现在能够正确响应DPI更改并自行更新。

请注意,Windows支持Windows 10 v1803上的混合模式DPI扩展,而v1607以上版本支持Per-Monitor V2。

要试用这些功能,必须启用以下应用程序清单和AppContext标志:

  1.在您的应用程序中启用Per-Monitor DPI:在app.manifest中打开Per-Monitor V2

  2.在WPF中启用高DPI支持:目标.NET Framework 4.6.2或更高版本

  3.在app.config中设置AppContext开关

  或者,在App.Config中设置AppContextSwitch Switch.System.Windows.DoNotUsePresentationDpiCapabilityTier2OrGreater = false以启用.NET 4.8中引入的Per-Monitor V2和混合模式DPI支持。

最终App.Config中的运行时部分可能如下所示:

AppContext开关也可以在注册表中设置。您可以参考AppContext类以获取其他文档。

WPF - 支持UIAutomation ControllerFor属性

UIAutomation的ControllerFor属性返回一个自动化元素数组,这些元素由支持该属性的自动化元素操作。此属性通常用于自动建议可访问性。当自动化元素影响应用程序UI或桌面的一个或多个段时,将使用ControllerFor。否则,很难将控制操作的影响与UI元素相关联。此功能增加了控件为ControllerFor属性提供值的功能。

AutomationPeer中添加了一个新的虚拟方法:

要为ControllerFor属性提供值,只需覆盖此方法并返回此AutomationPeer操作的控件的AutomationPeers列表:

WPF - 键盘访问的工具提示

当前工具提示仅在用户将鼠标光标悬停在控件上时显示。在.NET Framework 4.8中,WPF添加了一项功能,可以使工具提示在键盘焦点上显示,也可以通过键盘快捷键显示。

要启用此功能,应用程序需要通过AppContext开关“Switch.UseLegacyAccessibilityFeatures.3”和“Switch.UseLegacyToolTipDisplay”来定位.NET Framework 4.8或选择加入。

示例App.config文件:

启用后,包含工具提示的所有控件将在控件接收键盘焦点后开始显示。随着时间的推移或键盘焦点发生变化时,工具提示可以被解除。用户还可以通过新的键盘快捷键Ctrl + Shift + F10手动关闭工具提示。一旦工具提示被解除,它可以通过相同的键盘快捷方式再次显示。

注意:Ribbon控件上的RibbonToolTips不会显示在键盘焦点上 - 它们只会通过键盘快捷键显示。

WPF - 添加了对SizeOfSet和PositionInSet UIAutomation属性的支持

Windows 10引入了新的UIAutomation属性SizeOfSet和PositionInSet,应用程序使用它们来描述集合中项目的数量。然后,UIAutomation客户端应用程序(如屏幕阅读器)可以查询应用程序以获取这些属性,并宣布应用程序UI的准确表示。

此功能添加了对WPF应用程序的支持,以将这两个属性公开给UIAutomation。这可以通过两种方式实现:

  1.DependencyProperties 

新的DependencyProperties SizeOfSet和PositionInSet已添加到System.Windows.Automation.AutomationProperties命名空间。开发人员可以通过XAML设置其值:

  2.AutomationPeer虚拟方法 

虚拟方法GetSizeOfSetCore和GetPositionInSetCore也已添加到AutomationPeer类中。开发人员可以通过覆盖这些方法为SizeOfSet和PositionInSet提供值:

自动值 

ItemsControls中的项目将自动为这些属性提供值,而无需开发人员的其他操作。如果ItemsControl已分组,则组的集合将表示为一个集合,每个组计为一个单独的集合,该组中的每个项目都提供其在该组内的位置以及该组的大小。虚拟化不会影响自动值。即使一个项目没有实现,它仍然会计入集合的总大小,并影响它的兄弟项目集合中的位置。

仅当开发人员以.NET Framework 4.8为目标或已将AppContext开关设置为“Switch.UseLegacyAccessibilityFeatures.3”(例如通过App.config文件)时,才会提供自动值:

结尾

请在.NET Framework 4.8中尝试这些改进,并在下面的评论中或通过GitHub分享您的反馈。

原文地址:https://www.cnblogs.com/minotauros/p/10736607.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

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

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

相关文章

[NewLife.XCode]数据层缓存(网站性能翻10倍)

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代…

[NewLife.XCode]高级查询(化繁为简、分页提升性能)

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代…

微软云Azure训练营 | 八城联动,全球盛会

Global Azure Bootcamp是由微软发起、MVP参与组织的全球化学习交流活动。每年会挑选一个特定的时间,在同一天内,全球不同地区将同时开展。2019年全球Azure训练营(Global Azure Bootcamp)将于2019年4月27日在全球270多个城市同时举…

长沙4月21日开发者大会暨.NET社区成立大会活动纪实

活动总结2019年4月21日是一个斜风细雨、微风和煦的美好日子,由长沙.NET技术社区、腾讯云云加社区、微软Azure云技术社区、中国.NET技术社区、长沙柳枝行动、长沙互联网活动基地(唐胡子俱乐部)等多家单位共同主办的长沙开发者技术大会暨长沙.N…

SQL Server AlwaysOn 集群 关于主Server IP与Listener IP调换的详细测试

1. 背景SQL Server 搭建AlwaysOn后,我们就希望程序连接时使用虚拟的侦听IP(Listener IP),而不再是主Server 的IP。如果我们有采用中间件,则可以在配置中,直接用Listener IP 替换掉 Server IP,可…

在 DotNetCore 3.0 程序中使用通用协议方式启动文件关联应用

问题描述在传统的基于 .NET Framework 的 WPF 程序中,我们可以使用如下代码段启动相关的默认应用:Copy# 启动默认文本编辑器打开 helloworld.txtProcess.Start("helloworld.txt");# 启动默认浏览器打开 https:Process.Start("https://hip…

.NetCoreLinuxDockerPortainer踩坑历险记

最近有一个云服务器和数据库的迁移任务,踩坑爬坑无数次,觉得必须要记录一下。大家瓜子花生准备好,听我慢慢讲故事#手动笑哭#。故事背景公司是做电商业务的,在天猫有几家旗舰店数据量也很大。阿里有一个称为聚石塔的平台&#xff0…

深入源码理解.NET Core中Startup的注册及运行

开发.NET Core应用,直接映入眼帘的就是Startup类和Program类,它们是.NET Core应用程序的起点。通过使用Startup,可以配置化处理所有向应用程序所做的请求的管道,同时也可以减少.NET应用程序对单一服务器的依赖性,使我们…

Python、Java、TypeScript 和 Perl 作者谈语言设计

Python 作者 Guido van Rossum、Java 作者 James Gosling、Turbo Pascal 和 TypeScript 作者 Anders Hejlsberg,以及 Perl 作者 Larry Wall 本月早些时候齐聚一堂,讨论了(YouTube)编程语言设计的过去和未来。Guido van Rossum 说,设计一种语言…

Asp.Net Core Web应用程序—探索

前言作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要。因为,目前微软已经搞出了两个框架了,一个是Net标准(.NetFramework)&#…

智能优化算法应用:基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.跳蛛算法4.实验参数设定5.算法结果6.参考文献7.MA…

让你的ASP.NET Core应用程序更安全

对于ASP.NET Core应用程序,除了提供认证和授权机制来保证服务的安全性,还需要考虑下面的一些安全因素:CSRF强制HTTPS安全的HTTP HeadersCSRFASP.NET Core通过AntiForgeryToken来阻止CSRF攻击,一般来说,当用户做表单提交…

.net core 中间件管道底层剖析

.net core 管道(Pipeline)是什么?由上图可以看出,.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程,如果我们简化一下成下图来看的话,.net core 的管道其实就是中间件的部分。微软中…

架构为什么要以领域为核心

很久以前, 人们以为地球是太阳系的中心.然后一位聪明人, 哥白尼, 他改变了我们对太阳系的看法. 他认为太阳是太阳系的中心:这是对太阳更好的一个解释, 更简单也更具说服力. 事实上, 以太阳为中心的模型确实是更优雅的.上面这件事也发生在软件开发里. 下面这个就是很多开发者惯用…

201403-5 任务调度

哇&#xff0c;ccf csp认证考试 历年真题解&#xff08;一本书&#xff09;真厉害。 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring>using namespace std;typedef long long LL; typedef pair<int,int> PII; con…

C# - 为引用类型重定义相等性 - 继承相关

派生类这是上面Citizen类的一个子类&#xff1a;下面我重写object.Equals() 方法&#xff1a;大部分逻辑都在base.Equals()方法里了&#xff0c;首先如果父类的Equals()方法返回false&#xff0c;那么下面也就不用做啥了。但是如果父类Equals()认为这两个实例是相等的&#xff…

微软百名员工签名力挺996.ICU

中国程序员上传到 GitHub 的 996.ICU repo 火速在互联网广泛传播时&#xff0c;996 工作制引起了全球的广泛关注&#xff0c;Python 之父直指这是不人道的行为&#xff0c;事情经过不断发酵&#xff0c;中国官方媒体也接连发声表态要警惕「996 工作制」。就在今日&#xff0c;微…

P1174 打砖块

P1174 打砖块 题意&#xff1a; 题解&#xff1a; 参考题解&#xff1a; I_AM_HelloWord danxmz2006 这两个博客结合看&#xff0c;大致就能理解 我们只在N处转移&#xff0c;面对Y类的块无需决策&#xff0c;因为Y类的块可以一直打 不同的打砖块的顺序&#xff0c;决定了我…

包治百病 | 如何将一个.NET Core类库发布到NuGet

点击上方蓝字关注“汪宇杰博客”NuGet是.NET世界的包管理器&#xff0c;有官方的nuget.org&#xff0c;也允许构建公司和私人的服务器。在.NET Core的时代&#xff0c;封装一个NuGet包比以往更容易&#xff0c;我们来看看吧&#xff01;NuGet账号如果你想和微软一起予力众生&am…

如何在ASP.NET Core中使用Azure Service Bus Queue

原文&#xff1a;USING AZURE SERVICE BUS QUEUES WITH ASP.NET CORE SERVICES作者&#xff1a;damienbod[1] 译文&#xff1a;如何在ASP.NET Core中使用Azure Service Bus Queue地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10760227.html作者&#xff1a;Lamond Lu源代…