.NET 9 AOT的突破 - 支持老旧Win7与XP环境

引言

随着技术的不断进步,微软的.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 版本能够进一步打破界限,让编程变得更加灵活和高效。

感谢网友GSDM$達分享的这个好消息,大石头这篇文章《各版本操作系统对.NET 支持情况》推荐大家阅读:https://newlifex.com/tech/os_net

参考AOT项目:https://github.com/dotnet9/CodeWF.Toolbox

技术交流

软件开发技术交流添加 QQ 群:771992300

或扫站长微信(codewf,备注加群)加入微信技术交流群:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络层之IP协议,它带来了哪些功能,真的能顺着网线找到?

前言 在上一篇&#xff0c;学习了链路层的以太网协议&#xff0c;知道了MAC地址&#xff0c;在以太网中&#xff0c;找到对应的终端最终依靠的是MAC地址&#xff0c;但是在实际使用中&#xff0c;大家可能发现并不是使用的MAC地址&#xff0c;而是IP协议&#xff0c;比如 &…

linux之网络子系统- 内核发送数据包流程以及相关实际问题

一、相关实际问题 查看内核发送数据消耗的CPU时应该看sy还是si在服务器上查看/proc/softirqs&#xff0c;为什么NET_RX要比NET_TX大得多发送网络数据的时候都涉及那些内存拷贝操作零拷贝到底是怎么回事为什么Kafka的网络性能很突出 二、网络包发送过程总览 调用系统调用send发…

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦&#xff01;&#x1f929; 基本配置 打包工具&#xff1a;Vite 前端框架&#xff1a;ElementPlus 开发语言&#xff1a;Vue3、TypeScript、Sass 代码检查&#xff1a;ESLint、Prettier IDE&#xf…

操作系统及MySQL管理系统客户端的介绍

操作系统 1、Windows&#xff1a; 图形化管理工具&#xff1a;如控制面板、设置应用、任务管理器等。 客户端&#xff1a;命令提示符&#xff08;cmd&#xff09;和PowerShell用于命令行操作。 2、Linux&#xff1a; 图形化管理工具&#xff1a;如GNOME、KDE等桌面环境中的系…

基于SSM+小程序的旅游社交登录管理系统(旅游4)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 本旅游社交小程序功能有管理员和用户。管理员有个人中心&#xff0c;用户管理&#xff0c;每日签到管理&#xff0c;景点推荐管理&#xff0c;景点分类管理&#xff0c;防疫查询管理&a…

一文带你了解:六款适合PC端的工时管理工具

1. 板栗看板 板栗看板是一个可视化的事项管理工具&#xff0c;由看板&#xff08;board&#xff09;、列表&#xff08;list&#xff09;、卡片&#xff08;card&#xff09;三个基本元素构成。用户通过在 “看板” 上布置和移动 “列表” 与 “卡片”&#xff0c;可以跟踪事项…

数据结构算法学习方法经验总结

DSA:Data Structures, Algorithms, and Problem-Solving Techniques 三大核心支柱 一次学习一个主题&#xff0c;按照如下顺序学习 如何开始学习新的主题 学习资源 https://www.youtube.com/playlist?listPLDN4rrl48XKpZkf03iYFl-O29szjTrs_O (Algorithms) https://ww…

ANA基因组数据库(ANAgdb)

ANA进化阶由早期发育的被子植物谱系组成&#xff0c;包括无油樟目&#xff08;Amborellales&#xff09;、睡莲目&#xff08;Nymphaeales&#xff09;和木兰藤目&#xff08;Austrobaileyales&#xff09;&#xff0c;在进化上具有重要地位。 ANA基因组数据库&#xff08;ANA…

晟矽微PWM案例分析

/****************************************************************************** ; * 型号 : MC32F7361 ; * 创建日期 : 2021.12.21 ; * 公司/作者 : SINOMCU-FAE ; * 晟矽微技术支持 : 204…

检索引擎Elasticsearch

一.为什么要用Elasticsearch 由于我们在运行我们的项目的时候通常都是将数据存到mysql或者sql serve等数据库中&#xff0c;在进行数据搜索时使用sql 语句 like进行模糊匹配查询&#xff0c;其一&#xff1a;虽然可以查到数据&#xff0c;但是它模糊匹配查询速度较慢&#xff0…

vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页,同时解决预览pdf显示模糊的问题

vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页&#xff0c;同时解决预览pdf显示模糊的问题 插件介绍 pdfdist-mergeofd插件的作用可查看这篇文章&#xff0c;同时使用ofdjs和pdfjs遇到的问题&#xff0c;和解决方法——懒加载 该插件主要是为了解决pdfjs和ofdjs同时…

深度学习:yolov3的使用--建立模型

使用argparse模块来定义和解析命令行参数 创建一个ArgumentParser对象 parser argparse.ArgumentParser() 训练的轮数&#xff0c;每批图像的大小&#xff0c;更新模型参数之前累积梯度的次数,模型定义文件的路径。 parser.add_argument("--epochs", typeint, d…

38.第二阶段x86游戏实战2-HOOK窗口消息机制(解决多开窗口句柄问题)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

详解汉明纠错码原理以及FPGA实现

文章目录 一、汉明纠错码简介二、汉明码编码原理以及步骤三、汉明码纠错原理以及步骤四、FPGA实现74汉明编码器五、FPGA实现74汉明解码器 一、汉明纠错码简介 汉明纠错码&#xff08;Hamming Code&#xff09;是一种用于检测和纠正数据传输中错误的编码方法。它由理查德汉明&am…

无人机光电识别跟踪算法!

一、算法概述 无人机光电识别跟踪算法结合了可见光和红外成像技术&#xff0c;通过光学系统收集目标的光学信息&#xff0c;并将其转换为电信号进行处理和分析。该算法能够实现对目标的快速、准确识别与追踪&#xff0c;极大提升了无人机在复杂环境下的作业能力和效率。 二、…

Ethernet 系列(6)-- 基础学习::OSI Model

&#xff08;写在前面&#xff1a;最近在学习车载以太网的知识&#xff0c;顺便记录一下知识点。&#xff09; OSI&#xff08;Open System Interconnect &#xff09;模型是一种网络通信框架&#xff0c;由国际标准化组织&#xff08;‌ISO&#xff09;在1985年提出&#xff0…

day15:shell基础

一&#xff0c;编程语法分类&#xff08;了解&#xff09; 编程范式&#xff1a; 面向过程&#xff1a;程序通过按步骤执行函数或过程完成任务&#xff0c;强调流程控制和函数调用&#xff0c;适合流程明确的任务&#xff0c;如 C。面向对象&#xff1a;通过“类”和“对象”封…

无人机测绘遥感技术算法概述!

一、数据采集算法 航线规划算法 根据测绘任务需求&#xff0c;利用地理信息系统&#xff08;GIS&#xff09;和遥感技术&#xff0c;对无人机进行航线规划。 考虑地形、气候、障碍物等因素&#xff0c;优化飞行路径&#xff0c;确保数据采集的完整性和准确性。 传感器控制算…

Pytest-Bdd-Playwright 系列教程(6):在测试步骤函数中设置别名数据共享

Pytest-Bdd-Playwright 系列教程&#xff08;6&#xff09;&#xff1a;在测试步骤函数中设置别名&数据共享 前言一、步骤别名二、特性文件三、测试脚本四、运行测试五、小测验总结 前言 有的时候&#xff0c;为了提高可读性&#xff0c;我们需要使用不同的名称来声明相同的…

HTML 分组标签与语义化应用:合理使用 <div>、<span> 和基础语义容器

文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…