让.NET 8 Native AOT应用兼容Windows 7/Vista

1. 背景

首先感谢stevefan1999-personal音丨HAT丶molisha毛利wwh(排序以时间顺序)提供一些方案为我提供思路。

其实自从微软为.NET支持native-aot开始,一直以来就有用户反馈说希望在Windows 7或者更低版本能运行.NET Native AOT应用。也有一些人一直在这方面的可行性以及技术验证。

而我在这次五一长假抽了点时间做了解决了这些兼容性问题,同时再次致谢技术探索的先驱们。

2. 兼容方法

先直入主题,怎么编译兼容Windows Vista RTM的.NET Native AOT应用。

如果只是做兼容,那么使用YY-Thunks就可以了,方法如下:

2.1. 将TFM的OS调整为Windows

这是因为YY-Thunks是.net8.0-windows下的一个包,方法如下:

项目右键 -- 属性 -- 目标OS -- Windows

4837f76fedeec75d7f2ce26a116282e7.jpeg

如果同学还需要把程序兼容到Windows XP RTM,那么还需要在TargetFramework后添加<SupportedOSPlatformVersion>5.1</SupportedOSPlatformVersion>

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net8.0-windows</TargetFramework>
        <!--把SupportedOSPlatformVersion添加到此处,如果不用兼容XP,那么无视该字段-->
        <SupportedOSPlatformVersion>5.1</SupportedOSPlatformVersion>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    </PropertyGroup>
  <!--...-->
</Project>

2.2. 安装YY-Thunks v1.0.10-Beta3 预览版

此外还需要安装YY-Thunks v1.0.10-Beta3,这个版本开始支持了.NET Native AOT应用中使用的新API,安装方法如下:

项目右键 -- 管理NuGet程序包 -- 勾选包括预发行版 -- 搜索YY-Thunks -- 安装YY-Thunks v1.0.10-Beta3

那么目前大家只需要从NuGet安装YY-Thunks v1.0.10-Beta3这个预览版(未来可以安装更新的版本,只要版本号大于等于1.0.10-Beta3),从NuGet管理器中也可以看到1.0.10-Beta3版本新增了.net8.0-windows7.0

4de0fc0a762db872d752136cc6f7deb0.jpeg

2.3. 完毕

现在开始尽情的使用.NET Native AOT吧,如果觉得.NET Native AOT应用还需要以来CRT运行库部署比较麻烦,那么还可以使用VC-LTL!没错VC-LTL v5.0.10-Beta2开始也添加了.NET Native AOT支持。

也直接从NuGet安装即可,但是记得安装v5.0.10-Beta2或者更高版本。

细心的同学也许已经发现,VC-LTL会自动依赖YY-Thunks,所以安装了VC-LTL的同学无需特意安装YY-Thunks。
9341bfdc37901285862f45acbba82089.jpeg

00337d493cc410e7af29255d5a5c50c5.jpeg

VC-LTL msvcrt模式

c41c988a012816421b321def80b5f348.jpeg

VC-LTL ucrt模式,不使用API Set

3. 兼容原理

其实主要就是参考了微软这个文件

runtime/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets at d3ab95d3be895a1950a46c559397780dbb3e9807 · dotnet/runtime (github.com)

我们会发现

  • AdditionalNativeLibraryDirectories 就是添加库搜索目录

  • LinkerArg则代表直接会传递给链接器(YY-Thunks的obj需要)

而且微软是在SetupOSSpecificProps Task中处理的,理论上我们在SetupOSSpecificProps Task之前搞一些小动作就可以了,坏笑……

4. 尾声

谢谢大家的观赏,祝大家玩的开心。如果更好的意见,可以在下面评论或者在私聊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值