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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/9341bfdc37901285862f45acbba82089.jpeg)
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. 尾声
谢谢大家的观赏,祝大家玩的开心。如果更好的意见,可以在下面评论或者在私聊。