引言
隨著技術(shù)的不斷進步,微軟的.NET 框架在每次迭代中都帶來了令人驚喜的新特性。在.NET 9 版本中,一個特別引人注目的亮點是 AOT( Ahead-of-Time)支持,它允許開發(fā)人員將應(yīng)用程序在編譯階段就優(yōu)化為能夠在老舊的 Windows 系統(tǒng)上運行,包括 Windows 7 和甚至 Windows XP。這不僅提升了性能,也為那些依然依賴這些老平臺的企業(yè)和個人開發(fā)者提供了新的可能性。
小知識普及:
- NET 9 AOT 簡介
.NET 9 的 AOT 編譯器通過靜態(tài)編譯,將.NET 應(yīng)用程序轉(zhuǎn)換為可以直接在目標機器上執(zhí)行的可執(zhí)行文件,消除了在運行時的 JIT(Just-In-Time)編譯所需的時間和資源。這對于對性能要求高且需要支持舊版系統(tǒng)的場景具有顯著優(yōu)勢。
- 支持 Windows 7 與 Windows XP 的背景
盡管 Windows 7 和 XP 已經(jīng)不再是主流操作系統(tǒng),但它們在某些特定領(lǐng)域,如企業(yè)遺留系統(tǒng)、嵌入式設(shè)備或者資源受限的環(huán)境中仍有廣泛應(yīng)用。.NET 9 的 AOT 編譯這一擴展,旨在滿足這些場景的兼容性和性能需求。
- 如何實現(xiàn)
- 編譯過程優(yōu)化:NET 9 在 AOT 編譯時,對代碼進行了更為細致的優(yōu)化,使得生成的可執(zhí)行文件更小,啟動速度更快。
- 向下兼容性:通過精心設(shè)計的編譯策略,確保了對 Win7 及 XP API 的兼容性,使代碼能夠無縫運行。
- 安全性考量:雖然支持老舊系統(tǒng),但.NET 9 依然注重安全,提供了一定程度的保護機制以抵御潛在的風(fēng)險。
- 實例應(yīng)用與優(yōu)勢
- 性能提升:AOT 編譯后的程序通常比 JIT 執(zhí)行的程序更快,尤其對于 CPU 密集型任務(wù)。
- 部署簡易:無需用戶安裝.NET 運行時,簡化了部署流程。
- 維護成本降低:對于依賴老舊系統(tǒng)的企業(yè),避免了頻繁升級運行時的困擾。
本文只在分享網(wǎng)友及站長實踐的一個成果,如有更多發(fā)現(xiàn),歡迎投稿或給本文PR。
Windows 7 支持
下圖是網(wǎng)友編譯的 Avalonia UI 跨平臺項目在 Win 7 非 SP1 環(huán)境運行效果截圖:
如上圖,左側(cè)是程序運行界面,右側(cè)是操作系統(tǒng)版本。
為了便于讀者代碼拷貝,參考配置貼出如下:
<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>
<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" />
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.1.1" />
<PackageReference Include="Avalonia.ReactiveUI" Version="11.1.1" />
</ItemGroup>
</Project>
上面關(guān)鍵配置說明:
<PublishAot>true</PublishAot>
該開關(guān)用于支持AOT編譯發(fā)布
<WindowsSupportedOSPlatformVersion>5.1</WindowsSupportedOSPlatformVersion>
支持在Windows XP或更高版本的Windows操作系統(tǒng)上運行
VC-LTL
VC-LTL是一個基于微軟VC修改的開源運行時,有效減少應(yīng)用程序體積并擺脫微軟運行時DLL,比如msvcr120.dll、api-ms-win-crt-time-l1-1-0.dll等依賴。
Win7及以上版本,可能AOT就能正常運行(不需要安裝.NET運行時)。但也有可能在目標系統(tǒng)運行失敗,可添加該庫嘗試重新AOT編譯。詳細原理參考該倉庫:https://github.com/Chuyu-Team/VC-LTL
經(jīng)站長實測:Windows7可能還需要添加YY-Thunks包引用:
<PackageReference Include="YY-Thunks" Version="1.1.4-Beta3" />
關(guān)于YY-Thunks:鏈接,說明:
眾所周知,從 Windows 的每次更新又會新增大量 API,這使得兼容不同版本的 Windows 需要花費很大精力。導(dǎo)致現(xiàn)在大量開源項目已經(jīng)不再兼容一些早期的 Windows 版本,比如 Windows XP RTM。
難道就沒有一種快速高效的方案解決無法定位程序輸入點的問題嗎?
YY-Thunks(鴨船),存在的目的就是抹平不同系統(tǒng)的差異,編譯時單純添加一個 obj 即可自動解決這些兼容性問題。讓你兼容舊版本 Windows 更輕松!
經(jīng)測試,Winform 可以.NET 9 x86 AOT發(fā)布后運行,效果截圖如下:
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
{
[STAThread]
static void Main()
{
ComWrappers.RegisterForMarshalling(WinFormsComInterop.WinFormsComWrappers.Instance);
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
Windows XP 支持
目前測試可運行控制臺程序:
網(wǎng)友得出結(jié)論:
XP 需要鏈接 YY-Thunks,參考鏈接:https://github.com/Chuyu-Team/YY-Thunks(前面有提及,Win7如果失敗也可以添加該包引用嘗試)
大家可關(guān)注 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>
網(wǎng)友心得:
有待加強的部分
經(jīng)測試Prism框架使用會報錯:
使用HttpClient也會出錯:
2024-08-02
通過閱讀開源Avalonia主題庫 [Semi.Avalonia](irihitech/Semi.Avalonia: Avalonia theme inspired by Semi Design (github.com)) 的源碼及作者 Rabbitism
兔佬的PR已經(jīng)解決Prism問題的,其它庫問題使用方法應(yīng)該類似,修改如下:
主工程添加Roots.xml,內(nèi)容如下:
<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也是類似的處理方法,這里不贅述,需要你進行更多嘗試。
每個公司的不同項目都是極其不同、復(fù)雜的,實際發(fā)布還需要不斷測試,為了支持Windows7、Windows XP可能不得不做出使用庫替換、部分API使用取舍等操作,歡迎讀者將使用過程中的心得體會進行分享。
結(jié)語
.NET 9 的 AOT 支持無疑拓寬了.NET 生態(tài)的應(yīng)用范圍,為那些需要在老舊平臺上運行高性能應(yīng)用的開發(fā)者提供了強大的工具。隨著技術(shù)的發(fā)展,我們期待未來更多的.NET 版本能夠進一步打破界限,讓編程變得更加靈活和高效。
感謝網(wǎng)友GSD
及M$達
分享的這個好消息,大石頭這篇文章《各版本操作系統(tǒng)對.NET 支持情況》推薦大家閱讀:https://newlifex.com/tech/os_net
參考AOT項目:https://github.com/dotnet9/CodeWF.Toolbox
?轉(zhuǎn)自https://www.cnblogs.com/lsq6/p/18519287
該文章在 2024/11/7 9:42:12 編輯過