运行 dotnet test --collect:"Code Coverage" 现在默认禁用动态本机检测。 此更改会影响从原生代码收集代码覆盖率的方式。 它不会影响从托管代码收集代码覆盖率的方式。
已引入的版本
.NET 10 正式版
以前的行为
以前,动态本机仪器化默认是启用的,在无法使用静态本机仪器化时,会对本机模块使用回退方式。 静态和动态本机工具中对该行为进行了描述。
dotnet test --collect:"Code Coverage"
# Dynamic native instrumentation was enabled by default
新行为
从 .NET 10 开始,默认禁用动态本机检测。 选项 <EnableDynamicNativeInstrumentation>false</EnableDynamicNativeInstrumentation> 由 dotnet test 和 vstest 默认设置。 如果在 runsettings 文件中显式设置该选项,则不会覆盖它。
dotnet test --collect:"Code Coverage"
# Dynamic native instrumentation is now disabled by default
可以通过在 <EnableDynamicNativeInstrumentation>true</EnableDynamicNativeInstrumentation> 文件中设置来重新启用动态的本机仪器化。 但是,执行此作时,可能会失败并显示“无法继续执行代码,因为找不到 covrun64.dll”。此错误也可能发生在 covrun32.dll 32 位进程中。
破坏性变更的类型
此更改为行为更改。
更改原因
默认情况下启用动态本机检测以保持向后兼容性 dotnet test。 但是,将 DLL 注入进程的方式不是标准的。 通过 .NET 10 运行时中的 安全强化更改 ,找不到链接的 DLL,导致进程 崩溃并出现错误。 此错误在非交互式会话或命令行中可能不可见,但进程确实崩溃。
在默认情况下,dotnet-coverage 动态本机检测已禁用,这是一种使用相同基础工具收集代码覆盖率的替代方法。 在默认情况下,对于 Visual Studio 中没有原生项目的解决方案,它也是禁用的。
建议的措施
如果收集了没有任何本机组件的解决方案的覆盖范围,则不应受到影响。 但是,收集覆盖范围时可能会发现性能提高。
如果收集包含本机组件(例如C++项目)的解决方案的覆盖范围,则可以使用以下选项:
将项目配置为使用 静态原生工具化
或者
更新到 Microsoft.CodeCoverage 18.0.1 并启用动态本机检测:
- 将设置
<EnableDynamicNativeInstrumentation>true</EnableDynamicNativeInstrumentation>添加到 runsettings 文件。 - 通过设置
VSTEST_DISABLE_DYNAMICNATIVE_CODECOVERAGE_DEFAULT_SETTING=1环境变量,全局选择退出此新默认值。
同样,在使用 VSTest 版本 18.0.1 及更高版本收集代码覆盖率时,如果系统安装了 .NET 10 SDK,则需要确保能够成功收集动态本机覆盖率
vstest.console。- 将设置
受影响的 API
没有。