net 9 aot的突破 - 支持老舊win7與xp環境

net 9 aot的突破 - 支持老舊win7與xp環境

net 9開始,aot支持win7和xp,不僅僅只支持sp1版本

最后更新 2024/10/23 下午1:49
沙漠尽头的狼
预计阅读 8 分钟
分类
Avalonia UI Winform .NET
专题
C# AOT
标签
.NET C# Avalonia UI Winform AOT

引言

隨著技術的不斷進步,微軟的.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 的源码及作者 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,备注加群)加入微信技术交流群:

Keep Exploring

延伸阅读

更多文章
同分类 / 同专题 2026/2/7

aot使用經驗總結

從項目創建伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 aot 發布測試。

继续阅读
同分类 / 同专题 2023/8/29

.NET 8.0 AOT DebugView

debugview 是一個應用程式,支持你監視本地系統上或可通過 tcp/ip 訪問的網絡上任何計算機上的調試輸出。

继续阅读