根据微软的官方文档:如何在 Windows 上安装 .NET ,Windows 7 PS 1 是可以支持部署 .NET 6 运行环境的,只是这个操作有些麻烦。
依赖项
如果要在 Windows 7 SP 1 上安装 .NET SDK 或运行时,则需要其他依赖项:
- Microsoft Visual C++ 2015-2019 Redistributable 64 位 / 32 位
- KB3063858 64 位 / 32 位
- Microsoft 根证书颁发机构 2011(仅限 .NET Core 2.1 脱机安装程序)
可能会遇到的问题
1、安装无反应
如果遇到安装 Visual C++ 无反应的情况,有可能是 Windows Installer 服务未开启。在服务管理中将禁用的 Windows Installer 服务开启即可。
2、KB3063858 补丁安装失败
这种失败有两种可能:
1、Windows Update 服务未开启,尝试开启该服务后再试。
2、计算机上已经安装 KB2533623 。在某些已经部署了 KB2533623 补丁的计算机上替代更新 KB3063858 无法正常安装,会提示不适用。这种情况直接跳过这个安装即可。
如何检测是否已经安装成功
启动“命令提示符”,输入 dotnet --info
,看到输出中包含以下字符则表示安装成功:
Microsoft.WindowsDesktop.App 6.0.0
为何在 Windows 7 系统需要打补丁
针对这个问题,林德熙大佬给出了详细的解释,参考:探索 dotnet core 为何在 Windows7 系统需要补丁的原因-林德熙 。简单来说,这和 Windows 7 在 10年前更新的 Kernel32.dll 有关。较旧的版本中缺少 .NET 所需的一个方法,需要更新后才能使用。
KB3063858 补丁是必要的吗?
根据林德熙大佬的文章, KB3063858 不是必要的。只要客户操作系统的 Kernel32.dll 已经更新,则 .NET 就可以正常运行。推荐使用以下方法根据 Kernel32.dll 中是否包含特定函数来判断是否需要安装 KB3063858 补丁:
using PInvoke; using System; namespace AddDllDirectoryDetectCs { class Program { static void Main(string[] args) { using (var hModule = Kernel32.LoadLibrary("Kernel32.dll")) { if (!hModule.IsInvalid) { IntPtr hFarProc = Kernel32.GetProcAddress(hModule, "AddDllDirectory"); if (hFarProc != IntPtr.Zero) { Console.WriteLine("Either running on Win8+, or KB2533623 is installed"); } else { Console.Write("Likely running on Win7 or older OS, and KB2533623 is not installed"); } } } // 以下是判断 Universal C Runtime 的逻辑,可以忽略 using (var hModule = Kernel32.LoadLibraryEx("UCRTBASE.dll", IntPtr.Zero, Kernel32.LoadLibraryExFlags.LOAD_LIBRARY_SEARCH_SYSTEM32)) { if (!hModule.IsInvalid) { Console.WriteLine("UCRT is available - Either running on Win10+ or KB2999226 is installed"); } else { Console.WriteLine("UCRT is not available - Likely running on OS older than Win10 and KB2999226 is not installed"); } } } } }
以上代码由 WPF 框架官方开发 Vatsan Madhavan 大佬提供,请看 vatsan-madhavan/checknetcoreprereqs: Helper utility to check .NET Core Prerequisites on Windows systems
没补丁net core 代码根本没法执行如何能运行c# 判断,难道用老版本