.NET7/8有bug吗?
内容提要
.NET 7/8存在一些bug,但通常不会遇到,因为托管层面稳定。两个有价值的问题是:1. 进行.NET 8分层编译Debug CLR时,调试会直接退出;2. 在生成.NET 7的主机corehost.sln时,代码报错,解决方案是升级cmake和VS版本。这些问题不影响托管层级的代码运行。
延伸解读
托管层稳定,非托管层问题多
文章指出.NET 7/8的bug主要存在于非托管层(CLR/JIT的C++代码),而托管层(业务代码依赖的SDK)非常稳健。官方runtime未关闭的Issuse约5K+,但普通开发者日常接触的是托管层,因此很少遇到。这提醒我们,评估框架稳定性时需区分层次:业务开发无需过度担忧底层bug,但涉及运行时定制或调试时则需留意。
分层编译调试退出:难以定位的运行时问题
Issue1描述了.NET 8分层编译Debug CLR时调试器不定时退出的现象。由于分层编译涉及多线程并行,需同时监控主线程、析构线程、工作线程等,定位难度极高。作者坦言目前无法确认问题点。该bug不影响托管代码运行,但给需要调试运行时的开发者带来困扰,也说明底层调试工具链仍有改进空间。
构建报错:升级工具链的实用启示
Issue2是在生成.NET 7主机corehost.sln时出现代码报错,主要涉及hostfxr代码。解决方案是升级cmake和VS版本。作者由此提出一个思路:触及.NET底层核心时,应尽量使用最新工具链版本,以避免新旧版本不兼容带来的不必要问题。这对从事运行时或本地库开发的读者具有参考价值。
Q&A
.NET 7/8 到底有没有 bug?
有,而且不少,官方 runtime 目前未关闭的 Issue 大约有 5K+。但平常很少遇到,因为平常用到的都是托管层面,托管层面基本不会出错,SDK 非常稳健。这些 bug 主要存在于非托管层面,即 CLR/JIT 的 C++ 代码中。
为什么我平时用 .NET 7/8 很少遇到 bug?
因为日常开发使用的都是托管层面的功能,托管层面与业务层级挂钩,SDK 非常稳健,基本上不会出错。已知的 bug 大多集中在非托管层面(CLR/JIT 的 C++ 代码),不影响托管代码的运行。
.NET 8 分层编译 Debug CLR 时调试直接退出是什么问题?
这是一个已知 Issue(编号 94964),在进行 .NET 8 分层编译 Debug CLR 时,调试几次后 VS 会直接自动退出 Debug,且退出时间不固定。由于分层编译是多线程并行执行,需要同时监控多个线程,确认问题点非常困难。该问题不影响托管层级的代码运行。
生成 .NET 7 的 corehost.sln 时出现代码报错怎么办?
这是 Issue 88115,主要是 hostfxr 代码的问题,在通过 build -vs 生成时会出现莫名错误。解决方案很简单:升级 cmake 和 VS 到最新版本即可解决。这也提供了一个思路:触及 .NET 底层核心时,尽量使用最新的工具链版本,可以避免很多不必要的问题。
这两个 .NET 7/8 的 bug 会影响我的业务代码运行吗?
不会。这两个问题都不影响托管层级的业务代码运行。第一个是分层编译调试时 VS 退出,但分层编译能正常运行;第二个是生成主机项目时的工具链问题,升级工具链即可解决。它们都只涉及非托管层面的开发调试。
遇到 .NET 底层核心相关的问题,有什么通用解决思路?
可以往最新的工具链版本上靠,即升级到最新版本(如 cmake、VS 等),这样可以避免很多不必要问题的干扰。例如 Issue 88115 就是通过升级 cmake 和 VS 解决的。