首页 > 解决方案 > 如何在不更改 app.config(.NET 框架)的情况下让 VSTest 使用 ServerGC?

问题描述

我有一个 .NET 4.7.1 C# 类库,在一个单独的项目中有一些相关的测试。
我希望能够在 ServerGC 模式下运行测试,以复制消费者对类库的标准使用(对于普通测试和与性能相关的测试)。

根据此处的 Microsoft 文档,可以通过多种方式配置 ServerGC。
runtimeconfig.json 不是一个选项,因为这是一个 .NET Framework 项目。

在玩了一些常规项目和测试项目之后。似乎必须为任何父进程设置 ServerGC 才能使其生效。对于常规应用程序,这很好,并且可以轻松使用 MSBuild 属性ServerGarbageCollection或 app.config 文件。在通过 VSTest 运行项目的情况下,这会使测试运行程序 (vstest.console.exe) 成为父进程,因此意味着该ServerGarbageCollection属性无效。我宁愿不必更改 vstest.console.exe 的 app.config,因为该计算机上的所有测试运行都使用它,因此可能会干扰其他解决方案。

Microsoft 文档建议可以设置环境变量:COMPlus_gcServer值为 1 以启用 ServerGC。可以在 runsettings 文件中为 VSTest 设置环境变量,如下面的示例和此处文档的底部所示。该文档还指出,指定环境变量将强制执行该/InIsolation标志以确保设置环境变量,然后启动测试运行过程。但是,这似乎不起作用。

<RunSettings>
  <RunConfiguration>
    <EnvironmentVariables>
      <COMPlus_gcServer>1</COMPlus_gcServer>
    </EnvironmentVariables>
  </RunConfiguration>
</RunSettings>

我添加了一个简单的测试用例,它检查GCSettings.IsServerGC属性,尽管环境变量在同一测试中被成功读取为值为 1,但仍然给出 false。

编辑:经过更多阅读,看起来 runtimeconfig.json 属性、MSBuild 属性和环境变量都只是 .NETCore。这留下了唯一的选择,即以某种方式为 VSTest 提供包含该GCServer属性的 app.config。有没有办法通过运行设置或 VSTest 的命令行参数来做到这一点?

标签: c#garbage-collectionapp-configcsprojvstest

解决方案


推荐阅读