.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
相关产品推荐
相关产品推荐

