最近写的WPF项目需要支持Win7系统,之前使用的是NET6,但NET7和NET8这两代做了很多性能优化,而且集合表达式[]很好用,所以尝试更新。
按照官方的说法,NET6是最后一代官方支持Win7的版本,但不代表NET789一定不支持,只是官方发现了问题不会解决了。经过测试,789这三代完全可以在Win7运行,只是会有一些小问题。
-
需要安装KB3063858补丁,只有1.7MB。如果是Win7新系统,一般没有这个补丁,运行NET789的程序会直接报错崩溃。但安装之后就好了。具体可以看林德熙的这篇博客。
-
需要安装VC++运行库,这个装起来也很方便。实测只有NET9的Self-Contained程序需要安装,78是不需要的。估计是官方为了缩减自包含程序的体积,把这个运行库去掉了。
-
需要设置Runtime参数。如果你在Win7运行NET789的程序,会发现启动慢,并且内存占用2G左右,在网上很少有提到这个问题,并且也没有给出解决方案。
这个问题是因为从NET7开始,.NET Runtime的WriteXorExecute安全选项默认保持打开,之前都是默认关闭的。可能是Win7系统不兼容,所以内存暴涨。只要关闭这个选项就好了。在Github的这个Issue有相关讨论。
方法有2个,一是将环境变量设置为DOTNET_EnableWriteXorExecute=0,但这样环境变量不能随程序移动,不是很好的办法。
二是在主项目下新建一个runtimeconfig.template.json文件,这是runtime配置的模板文件,在里面写入以下内容:
{
"configProperties": {
"System.Runtime.EnableWriteXorExecute": false
}
}
这样,这个runtime配置就会在生成时写入程序,随程序移动了。注意:这个办法目前只在NET9有效!官方目前还没有把这个runtime选项添加到NET8,但已经加入milestone了,不知道什么时候才会加。
解决了这三个问题,可以在Win7完美运行。
其实也都不是很麻烦,前两个只要提前把文件下载,做到安装程序里,或者双击运行一下就好了。
最后一个只要添加一下runtimeconfig文件就好了。