引言

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

小知识普及:

  1. NET 9 AOT 简介

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

  1. 支持 Windows 7 与 Windows XP 的背景

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

  1. 如何实现
  • 编译过程优化:NET 9 在 AOT 编译时,对代码进行了更为细致的优化,使得生成的可执行文件更小,启动速度更快。
  • 向下兼容性:通过精心设计的编译策略,确保了对 Win7 及 XP API 的兼容性,使代码能够无缝运行。
  • 安全性考量:虽然支持老旧系统,但.NET 9 依然注重安全,提供了一定程度的保护机制以抵御潜在的风险。
  1. 实例应用与优势
  • 性能提升:AOT 编译后的程序通常比 JIT 执行的程序更快,尤其对于 CPU 密集型任务。
  • 部署简易:无需用户安装.NET 运行时,简化了部署流程。
  • 维护成本降低:对于依赖老旧系统的企业,避免了频繁升级运行时的困扰。

本文只在分享网友及站长实践的一个成果,如有更多发现,欢迎投稿或给本文PR。

Windows 7 支持

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

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

为了便于读者代码拷贝,参考配置贴出如下:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net9.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
<ApplicationManifest>app.manifest</ApplicationManifest>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
<PublishAot>true</PublishAot>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<InvariantGlobalization>true</InvariantGlobalization>
<!--支持在Windows XP或更高版本的Windows操作系统上运行,XP下尝试Ava失败-->
<WindowsSupportedOSPlatformVersion>5.1</WindowsSupportedOSPlatformVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<TargetPlatformMinVersion>5.1</TargetPlatformMinVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="VC-LTL" Version="5.1.1-Beta3" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="11.1.1" />
<PackageReference Include="Avalonia.Desktop" Version="11.1.1" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.1.1" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.1.1" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.1.1" />
<PackageReference Include="Avalonia.ReactiveUI" Version="11.1.1" />
</ItemGroup>
</Project>

上面关键配置说明:

  1. <PublishAot>true</PublishAot>

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

  1. <WindowsSupportedOSPlatformVersion>5.1</WindowsSupportedOSPlatformVersion>

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

  1. 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包引用:

<PackageReference Include="YY-Thunks" Version="1.1.4-Beta3" />

关于YY-Thunks:链接,说明:

众所周知,从 Windows 的每次更新又会新增大量 API,这使得兼容不同版本的 Windows 需要花费很大精力。导致现在大量开源项目已经不再兼容一些早期的 Windows 版本,比如 Windows XP RTM。

难道就没有一种快速高效的方案解决无法定位程序输入点的问题吗?

YY-Thunks(鸭船),存在的目的就是抹平不同系统的差异,编译时单纯添加一个 obj 即可自动解决这些兼容性问题。让你兼容旧版本 Windows 更轻松!

经测试,Winform 可以.NET 9 x86 AOT发布后运行,效果截图如下:

Winform 工程配置如下:

可拷贝配置如下:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net9.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<InvariantGlobalization>true</InvariantGlobalization>
<WindowsSupportedOSPlatformVersion>5.1</WindowsSupportedOSPlatformVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<TargetPlatformMinVersion>5.1</TargetPlatformMinVersion>
<PublishAot>true</PublishAot>
<_SuppressWinFormsTrimError>true</_SuppressWinFormsTrimError>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="VC-LTL" Version="5.1.1-Beta3" />
<PackageReference Include="WinFormsComInterop" Version="0.5.0" />
</ItemGroup>
</Project>

入口再加一句代码ComWrappers.RegisterForMarshalling(WinFormsComInterop.WinFormsComWrappers.Instance);:

using System.Runtime.InteropServices;

namespace WinFormsAotDemo;

internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration. ComWrappers.RegisterForMarshalling(WinFormsComInterop.WinFormsComWrappers.Instance); ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}

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 的工程配置如下:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<InvariantGlobalization>true</InvariantGlobalization>
<WindowsSupportedOSPlatformVersion>5.1</WindowsSupportedOSPlatformVersion>
<SupportWinXP>true</SupportWinXP>
<PublishAot>true</PublishAot>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="VC-LTL" Version="5.1.1-Beta3" />
</ItemGroup>
</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,内容如下:

<linker>
<assembly fullname="CodeWF.Toolbox.Desktop" preserve="All"/>
<assembly fullname="Ursa.PrismExtension" preserve="All" />
<assembly fullname="Prism" preserve="All" />
<assembly fullname="DryIoc" preserve="All" />
<assembly fullname="Prism.Avalonia" preserve="All"/>
<assembly fullname="Prism.DryIoc.Avalonia" preserve="All"/>
<assembly fullname="CodeWF.Toolbox" preserve="All" />
</linker>

主工程添加该XML配置:

<ItemGroup>
<TrimmerRootDescriptor Include="Roots.xml" />
</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,备注加群)加入微信技术交流群:

.NET 9 AOT的突破 - 支持老旧Win7与XP环境的更多相关文章

  1. 7款适用老旧设备并对初学者非常友好的轻量级Linux发行版

    我们由从 7 到 1 的顺序向大家介绍. 7. Linux Lite 正如其名,Linux Lite 是 Linux 发行版的一个轻量级版本,用户并不需要强大的硬件就可以将它跑起来,而且其使用非常简单 ...

  2. Angular 学习笔记 ( 创建 library, 转换老旧的 library )

    更新 : 2018-10-28 不知道为什么在 ng 跑一直做不到 .d.ts 最后发现,如果有一个插件 propagating-hammerjs.ts 那么就在 root create 一个 pro ...

  3. HomeKit 与老旧设备

    苹果推了HomeKit,已经有很多厂商在做,可以达到Siri控制所有设备的功能. 但是Siri也不是万能的,对人类的语义理解也会产生差错,不过我相信未来这个问题会解决掉.     如果家里有老旧的电视 ...

  4. 用mongodb 固定集合实现只保留固定数量的记录,自动淘汰老旧数据

    在一个保存report记录的场景中,我们使用MongoDB进行数据存储 example: db: report Collection: daily_report 创建db:  use report; ...

  5. CentOS7清理老旧内核

    CentOS7如果是一步步内核升级上来的将会面临一个问题(一般安装了图形化界面的系统常见),由于内核增多/boot/的容量减少,导致启动变慢.这时就需要清理老旧内核,释放/boot/空间. 使用una ...

  6. 有些新电脑采用“UEFI”作为固件。由于UEFI不支持DOS,所以在UEFI环境下安装的WIN10等系统也就无法使用基于DOS的一键GHOST

    有些新电脑采用“UEFI”作为固件.由于UEFI不支持DOS,所以在UEFI环境下安装的WIN10等系统也就无法使用基于DOS的一键GHOST

  7. 支持老版本IE的3种解决方案

    原文链接: 3 Solutions for Supporting Internet Explorer 翻译人员: 铁锚 翻译时间: 2014年2月14日 在刚发布的那几年,Internet Explo ...

  8. 拯救老旧工程,记桥接SpringMVC与Stripes框架

    背景: 公司基础设施部门推出了自己的微服务框架(以下简称M),要求所有业务应用都要接入进去,但坑爹的是M只提供了SpringMVC工程的support,对于采用Stripes作为MVC框架的应用并不支 ...

  9. 制作一个老旧C118的GSM便携式测试设备

    对于OsmocomBB也是被国内外大神玩得不亦乐乎.什么重定向攻击,中间人攻击.都是N年前的东西咯.当然鄙人不会这些.对于地下市场无非就是获取对方短信小则“老.虎.机”,大则支付宝.某日翻了翻“咸”鱼 ...

  10. 让网站支持老版本IE6、7、8、9浏览器的3种解决方案

    1.htmlshiv.js Remy的 HTML5shiv通过JavaScript 来创建HTML5元素(如 main, header, footer等).在某种程度上通过JavaScript 创建的 ...

随机推荐

  1. 高考志愿填报指南:使用AI阅读工具ChatDOC搭建专业、好用、免费的AI高考志愿填报系统

    高考志愿填报指南:使用 ChatDOC 搭建专业.好用.免费的 AI 高考志愿填报系统 不说废话,直接上干货.针对高考志愿填报,这篇文章能为你提供以下内容:高考志愿填报专业数据.高考志愿填报分析思路. ...

  2. 将整个工程的GBK转为utf-8格式

    eclipse将整个工程转为utf-8时原先中文注释会变为乱码,13年时写了个脚本将整个文件的java以及配置文件转为utf-8格式,下面是代码 package com.code.pd; import ...

  3. 不同浏览器input file样式不一样

    在开发项目过程中会碰到不同浏览器input file样式不一样. 经过分析,打算都用IE上面的附件上传样式,  方案如下: 1.在IE下截个如上面的上传按钮,并保存. 2.判断浏览器类型,如果是非IE ...

  4. C#自己封装数据库操作类BaseADO

    这几天学习数据库操作,就自己封装了一个数据库操作类,下面是代码展示 下面的例子是Access数据库 也可能用在Sql数据库中,只在在第一行代码上修改标识符即可 #define OLEDB_ using ...

  5. Ubuntu上snmp安装、配置、启动及远程测试完整过程

    说明 关于一个完整的教程,还是那句话,国内的要么不完整,要么就太旧了,而且思路也不清晰,所以这里写一篇完整的给大家分享一下. 虽然对于Linux主机的监控可以通过执行特定的命令来完成,但是相比之后,通 ...

  6. LeetCode300.最长递增子序列

    LeetCode300.最长递增子序列 力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列是由数组派生而来的序列,删除(或不删除 ...

  7. pip 安装包时提示 "WARNING: Skipping xxx due to invalid metadata entry 'name'"

    我最近在使用 pip 安装包的时候经常遇到如下警告: WARNING: Skipping /opt/homebrew/lib/python3.11/site-packages/numpy-1.26.3 ...

  8. HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容

    背景 随着消费电子产品和移动互联网的普及,未成年人互联网普及率96.8%,超过80%的未成年人都拥有自己的上网设备,而如何引导孩子正确上网一直是家长们的担忧.市场上很多电子设备.系统推出了一些未成年人 ...

  9. Java并发编程学习前期知识上篇

    Java并发编程学习前期知识上篇 我们先来看看几个大厂真实的面试题: 从上面几个真实的面试问题来看,我们可以看到大厂的面试都会问到并发相关的问题.所以 Java并发,这个无论是面试还是在工作中,并发都 ...

  10. 13 Python面向对象编程:装饰器

    本篇是 Python 系列教程第 13 篇,更多内容敬请访问我的 Python 合集 Python 装饰器是一种强大的工具,用于修改或增强函数或方法的行为,而无需更改其源代码.装饰器本质上是一个接收函 ...