You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework 4.8类库xUnit测试时无法加载InstalledFontCollection

解决方案:xUnit测试中System.Drawing.Text.InstalledFontCollection加载失败问题

针对你遇到的.NET Framework 4.8环境下,xUnit测试项目无法加载System.Drawing.Text.InstalledFontCollection但控制台应用正常的问题,可按以下步骤排查解决:

1. 统一项目平台目标

xUnit测试环境和控制台应用的平台架构不匹配可能导致类型加载失败:

  • 右键测试项目→属性→生成,将「平台目标」设置为与类库、控制台应用一致的架构(如x64或x86,避免使用Any CPU)。
  • 若测试运行器默认使用32位模式,需在测试设置中强制匹配目标架构(比如在Visual Studio的测试管理器中,选择「测试」→「设置」→「处理器架构」,设置为对应架构)。

2. 配置xUnit测试的桌面权限上下文

InstalledFontCollection依赖GDI+的桌面会话权限,xUnit默认的无交互运行上下文可能缺失该权限:

  • 在测试项目的app.config中添加以下配置,强制启用桌面兼容性:
    <configuration>
      <appSettings>
        <add key="xUnitEnableDesktop" value="true" />
      </appSettings>
    </configuration>
    
  • 或在测试类的初始化方法中手动触发GDI+上下文初始化:
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // 创建临时GDI+对象触发初始化
        using (var dummyBitmap = new System.Drawing.Bitmap(1, 1))
        using (System.Drawing.Graphics.FromImage(dummyBitmap))
        {
            // 空操作,仅完成GDI+环境加载
        }
    }
    

3. 替换InstalledFontCollection的依赖(类库代码层面)

既然是无GUI专用分支,可避免枚举系统字体,改用嵌入字体或指定路径加载,彻底绕过系统字体集合的依赖:

  • 使用PrivateFontCollection加载自定义字体文件:
    var privateFonts = new System.Drawing.Text.PrivateFontCollection();
    // 嵌入字体的话可从资源读取,示例为文件路径加载
    privateFonts.AddFontFile("fonts/NotoSans.ttf");
    // 将privateFonts传入HtmlRenderer的字体配置中
    

4. 检查测试项目的System.Drawing引用

确保测试项目引用的System.Drawing程序集与类库版本一致:

  • 右键测试项目→引用,确认System.Drawing已添加且版本为.NET Framework 4.8对应版本(通常为4.0.0.0及以上)。
  • 若引用缺失,手动添加:右键引用→添加引用→程序集→框架,勾选System.Drawing。

内容的提问来源于stack exchange,提问作者user18928007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:40:38