.NET 9 AOT的突破 - 支持老旧Win7与XP情况

打印 上一主题 下一主题

主题 993|帖子 993|积分 2979



引言

随着技术的不断进步,微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中,一个特别引人注目的亮点是  AOT( Ahead-of-Time)支持,它允许开辟职员将应用程序在编译阶段就优化为能够在老旧的 Windows 系统上运行,包罗 Windows 7 和甚至 Windows XP。这不仅提升了性能,也为那些依然依赖这些老平台的企业和个人开辟者提供了新的可能性。
小知识遍及:

  • NET 9 AOT 简介
.NET 9 的 AOT 编译器通过静态编译,将.NET 应用程序转换为可以直接在目的机器上执行的可执行文件,消除了在运行时的 JIT(Just-In-Time)编译所需的时间和资源。这对于对性能要求高且必要支持旧版系统的场景具有显著优势。

  • 支持 Windows 7 与 Windows XP 的背景
尽管 Windows 7 和 XP 已经不再是主流操作系统,但它们在某些特定领域,如企业遗留系统、嵌入式装备或者资源受限的情况中仍有广泛应用。.NET 9 的 AOT 编译这一扩展,旨在满足这些场景的兼容性和性能需求。

  • 怎样实现


  • 编译过程优化:NET 9 在 AOT 编译时,对代码进行了更为细致的优化,使得生成的可执行文件更小,启动速率更快。
  • 向下兼容性:通过精心设计的编译策略,确保了对 Win7 及 XP API 的兼容性,使代码能够无缝运行。
  • 安全性考量:虽然支持老旧系统,但.NET 9 依然注意安全,提供了一定程度的保护机制以抵御潜在的风险。

  • 实例应用与优势


  • 性能提升:AOT 编译后的程序通常比 JIT 执行的程序更快,尤其对于 CPU 密集型使命。
  • 部署简易:无需用户安装.NET 运行时,简化了部署流程。
  • 维护成本降低:对于依赖老旧系统的企业,避免了频繁升级运行时的困扰。
本文只在分享网友及站长实践的一个结果,如有更多发现,欢迎投稿或给本文PR。
Windows 7 支持

下图是网友编译的 Avalonia UI 跨平台项目在 Win 7 非 SP1 情况运行结果截图:

如上图,左侧是程序运行界面,右侧是操作系统版本。


为了便于读者代码拷贝,参考设置贴出如下:
  1. <Project Sdk="Microsoft.NET.Sdk">
  2.         <PropertyGroup>
  3.                 <OutputType>WinExe</OutputType>
  4.                 <TargetFramework>net9.0-windows</TargetFramework>
  5.                 <Nullable>enable</Nullable>
  6.                 <BuiltInComInteropSupport>true</BuiltInComInteropSupport>
  7.                 <ApplicationManifest>app.manifest</ApplicationManifest>
  8.                 <AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
  9.                 <PublishAot>true</PublishAot>
  10.         </PropertyGroup>
  11.         <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
  12.                 <InvariantGlobalization>true</InvariantGlobalization>
  13. <ItemGroup>
  14.     <TrimmerRootDescriptor Include="Roots.xml" />
  15. </ItemGroup><ItemGroup>
  16.     <TrimmerRootDescriptor Include="Roots.xml" />
  17. </ItemGroup>
  18.                 <WindowsSupportedOSPlatformVersion>5.1</WindowsSupportedOSPlatformVersion>
  19.                 <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  20.                 <TargetPlatformMinVersion>5.1</TargetPlatformMinVersion>
  21.         </PropertyGroup>
  22.         <ItemGroup>
  23.                 <PackageReference Include="VC-LTL" Version="5.1.1-Beta3" />
  24.         </ItemGroup>
  25.         <ItemGroup>
  26.                 <PackageReference Include="Avalonia" Version="11.1.1" />
  27.                 <PackageReference Include="Avalonia.Desktop" Version="11.1.1" />
  28.                 <PackageReference Include="Avalonia.Themes.Fluent" Version="11.1.1" />
  29.                 <PackageReference Include="Avalonia.Fonts.Inter" Version="11.1.1" />
  30.                
  31.                 <PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.1.1" />
  32.                 <PackageReference Include="Avalonia.ReactiveUI" Version="11.1.1" />
  33.         </ItemGroup>
  34. </Project>
复制代码
上面关键设置分析:

  • true
该开关用于支持AOT编译发布

  • 5.1
支持在Windows XP或更高版本的Windows操作系统上运行

  • VC-LTL
VC-LTL是一个基于微软VC修改的开源运行时,有效减少应用程序体积并摆脱微软运行时DLL,比如msvcr120.dll、api-ms-win-crt-time-l1-1-0.dll等依赖。
Win7及以上版本,可能AOT就能正常运行(不必要安装.NET运行时)。但也有可能在目的系统运行失败,可添加该库尝试重新AOT编译。详细原理参考该堆栈:https://github.com/Chuyu-Team/VC-LTL
经站长实测:Windows7可能还必要添加YY-Thunks包引用:
  1. [/code]关于YY-Thunks:[url=https://github.com/Chuyu-Team/YY-Thunks]链接[/url],分析:
  2. [indent]众所周知,从 Windows 的每次更新又会新增大量 API,这使得兼容差别版本的 Windows 必要花费很大精力。导致现在大量开源项目已经不再兼容一些早期的 Windows 版本,比如 Windows XP RTM。
  3. [/indent][indent]难道就没有一种快速高效的方案解决无法定位程序输入点的问题吗?
  4. [/indent][indent]YY-Thunks(鸭船),存在的目的就是抹平差别系统的差异,编译时单纯添加一个 obj 即可自动解决这些兼容性问题。让你兼容旧版本 Windows 更轻松!
  5. [/indent]经测试,Winform 可以.NET 9 x86 AOT发布后运行,结果截图如下:
  6. [align=center][img]https://img1.dotnet9.com/2024/07/0707.png[/img][/align]
  7. Winform 工程设置如下:
  8. [align=center][img]https://img1.dotnet9.com/2024/07/0710.png[/img][/align]
  9. 可拷贝设置如下:
  10. [code]<Project Sdk="Microsoft.NET.Sdk">
  11.         <PropertyGroup>
  12.                 <OutputType>WinExe</OutputType>
  13.                 <TargetFramework>net9.0-windows</TargetFramework>
  14.                 <Nullable>enable</Nullable>
  15.                 <UseWindowsForms>true</UseWindowsForms>
  16.                 <ImplicitUsings>enable</ImplicitUsings>
  17.         </PropertyGroup>
  18.         <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
  19.                 <InvariantGlobalization>true</InvariantGlobalization>
  20.                 <WindowsSupportedOSPlatformVersion>5.1</WindowsSupportedOSPlatformVersion>
  21.                 <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  22.                 <TargetPlatformMinVersion>5.1</TargetPlatformMinVersion>
  23.                 <PublishAot>true</PublishAot>
  24.                 <_SuppressWinFormsTrimError>true</_SuppressWinFormsTrimError>
  25.         </PropertyGroup>
  26.         <ItemGroup>
  27.                 <PackageReference Include="VC-LTL" Version="5.1.1-Beta3" />
  28.                 <PackageReference Include="WinFormsComInterop" Version="0.5.0" />
  29.         </ItemGroup>
  30. </Project>
复制代码
入口再加一句代码ComWrappers.RegisterForMarshalling(WinFormsComInterop.WinFormsComWrappers.Instance);:
  1. using System.Runtime.InteropServices;
  2. namespace WinFormsAotDemo;
  3. internal static class Program
  4. {
  5. <ItemGroup>
  6.     <TrimmerRootDescriptor Include="Roots.xml" />
  7. </ItemGroup>/// <summary>
  8. <ItemGroup>
  9.     <TrimmerRootDescriptor Include="Roots.xml" />
  10. </ItemGroup>///  The main entry point for the application.
  11. <ItemGroup>
  12.     <TrimmerRootDescriptor Include="Roots.xml" />
  13. </ItemGroup>/// </summary>
  14. <ItemGroup>
  15.     <TrimmerRootDescriptor Include="Roots.xml" />
  16. </ItemGroup>[STAThread]
  17. <ItemGroup>
  18.     <TrimmerRootDescriptor Include="Roots.xml" />
  19. </ItemGroup>static void Main()
  20. <ItemGroup>
  21.     <TrimmerRootDescriptor Include="Roots.xml" />
  22. </ItemGroup>{
  23. <ItemGroup>
  24.     <TrimmerRootDescriptor Include="Roots.xml" />
  25. </ItemGroup><ItemGroup>
  26.     <TrimmerRootDescriptor Include="Roots.xml" />
  27. </ItemGroup>// To customize application configuration such as set high DPI settings or default font,
  28. <ItemGroup>
  29.     <TrimmerRootDescriptor Include="Roots.xml" />
  30. </ItemGroup><ItemGroup>
  31.     <TrimmerRootDescriptor Include="Roots.xml" />
  32. </ItemGroup>// see https://aka.ms/applicationconfiguration.
  33. <ItemGroup>
  34.     <TrimmerRootDescriptor Include="Roots.xml" />
  35. </ItemGroup><ItemGroup>
  36.     <TrimmerRootDescriptor Include="Roots.xml" />
  37. </ItemGroup>ComWrappers.RegisterForMarshalling(WinFormsComInterop.WinFormsComWrappers.Instance);
  38. <ItemGroup>
  39.     <TrimmerRootDescriptor Include="Roots.xml" />
  40. </ItemGroup><ItemGroup>
  41.     <TrimmerRootDescriptor Include="Roots.xml" />
  42. </ItemGroup>ApplicationConfiguration.Initialize();
  43. <ItemGroup>
  44.     <TrimmerRootDescriptor Include="Roots.xml" />
  45. </ItemGroup><ItemGroup>
  46.     <TrimmerRootDescriptor Include="Roots.xml" />
  47. </ItemGroup>Application.Run(new Form1());
  48. <ItemGroup>
  49.     <TrimmerRootDescriptor Include="Roots.xml" />
  50. </ItemGroup>}
  51. }
复制代码
Windows XP 支持

现在测试可运行控制台程序:

网友得出结论:

XP 必要链接 YY-Thunks,参考链接:https://github.com/Chuyu-Team/YY-Thunks(前面有提及,Win7如果失败也可以添加该包引用尝试)

大家可关注 YY-Thunks 这个 ISSUE:https://github.com/Chuyu-Team/YY-Thunks/issues/66

控制台支持 XP 的工程设置如下:
  1. <Project Sdk="Microsoft.NET.Sdk">
  2.         <PropertyGroup>
  3.                 <OutputType>Exe</OutputType>
  4.                 <TargetFramework>net9.0</TargetFramework>
  5.                 <ImplicitUsings>enable</ImplicitUsings>
  6.                 <Nullable>enable</Nullable>
  7.         </PropertyGroup>
  8.         <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
  9.                 <InvariantGlobalization>true</InvariantGlobalization>
  10.                 <WindowsSupportedOSPlatformVersion>5.1</WindowsSupportedOSPlatformVersion>
  11.                 <SupportWinXP>true</SupportWinXP>
  12.                 <PublishAot>true</PublishAot>
  13.         </PropertyGroup>
  14.         <ItemGroup>
  15.                 <PackageReference Include="VC-LTL" Version="5.1.1-Beta3" />
  16.         </ItemGroup>
  17. </Project>
复制代码
网友心得:

有待增强的部门

经测试Prism框架使用会报错:

使用HttpClient也会堕落:

2024-08-02
通过阅读开源Avalonia主题库 [Semi.Avalonia](irihitech/Semi.Avalonia: Avalonia theme inspired by Semi Design (github.com)) 的源码及作者 Rabbitism 兔佬的PR已经解决Prism问题的,其它库问题使用方法应该类似,修改如下:
主工程添加Roots.xml,内容如下:
  1. <linker>
  2. <ItemGroup>
  3.     <TrimmerRootDescriptor Include="Roots.xml" />
  4. </ItemGroup><assembly fullname="CodeWF.Toolbox.Desktop" preserve="All"/>
  5. <ItemGroup>
  6.     <TrimmerRootDescriptor Include="Roots.xml" />
  7. </ItemGroup><assembly fullname="Ursa.PrismExtension" preserve="All" />
  8. <ItemGroup>
  9.     <TrimmerRootDescriptor Include="Roots.xml" />
  10. </ItemGroup><assembly fullname="Prism" preserve="All" />
  11. <ItemGroup>
  12.     <TrimmerRootDescriptor Include="Roots.xml" />
  13. </ItemGroup><assembly fullname="DryIoc" preserve="All" />
  14. <ItemGroup>
  15.     <TrimmerRootDescriptor Include="Roots.xml" />
  16. </ItemGroup><assembly fullname="Prism.Avalonia" preserve="All"/>
  17. <ItemGroup>
  18.     <TrimmerRootDescriptor Include="Roots.xml" />
  19. </ItemGroup><assembly fullname="Prism.DryIoc.Avalonia" preserve="All"/>
  20. <ItemGroup>
  21.     <TrimmerRootDescriptor Include="Roots.xml" />
  22. </ItemGroup><assembly fullname="CodeWF.Toolbox" preserve="All" />
  23. </linker>
复制代码
主工程添加该XML设置:
  1. <ItemGroup>
  2.     <TrimmerRootDescriptor Include="Roots.xml" />
  3. </ItemGroup>
复制代码
HttpClient也是类似的处理方法,这里不赘述,必要你进行更多尝试。
每个公司的差别项目都是极其差别、复杂的,实际发布还必要不断测试,为了支持Windows7、Windows XP可能不得不做出使用库替换、部门API使用弃取等操作,欢迎读者将使用过程中的心得体会进行分享。
结语

.NET 9 的 AOT 支持无疑拓宽了.NET 生态的应用范围,为那些必要在老旧平台上运行高性能应用的开辟者提供了强盛的工具。随着技术的发展,我们期待未来更多的.NET 版本能够进一步冲破界限,让编程变得更加灵活和高效。
感谢网友GSD及M$達分享的这个好消息,大石头这篇文章《各版本操作系统对.NET 支持情况》推荐大家阅读:https://newlifex.com/tech/os_net
参考AOT项目:https://github.com/dotnet9/CodeWF.Toolbox
技术交换
软件开辟技术交换添加 QQ 群:771992300
或扫站长微信(codewf,备注加群)加入微信技术交换群:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表