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

.NET Core 2.0 WebApi使用RazorLight遇System.TypeLoadException问题

System.TypeLoadException thrown by RazorLight's engine.Parse() with valid template path

问题描述

我正在尝试在邮件模板中使用Razor语法,参考了Microsoft Code的Razorlight教程实现了一个静态辅助类来获取模板,代码如下:

public static string GetTraderApplicationDeletedTemplate(Trader trader)
{
    string templatePath = $@"{Directory.GetCurrentDirectory()}\EmailTemplates";
    IRazorLightEngine engine = EngineFactory.CreatePhysical(templatePath);
    string result = engine.Parse("TraderDeletedEmail.cshtml", trader);
    return result;
}

调试时,engine.Parse方法抛出了无详细信息的System.TypeLoadException,我已经确认templatePath和.cshtml文件名都是有效的,想请教各位可能的故障原因是什么?


可能的排查方向及解决方案

根据我使用RazorLight的实战经验,这种无详细信息的TypeLoadException通常和以下几个原因有关,你可以逐一排查:

  • 依赖版本不兼容:RazorLight对.NET版本和配套的ASP.NET Core Razor组件有严格的版本匹配要求。比如你用了.NET 7但安装的是旧版RazorLight,就可能出现类型加载失败。建议打开NuGet包管理器,检查RazorLight的版本,尝试升级到和你项目目标框架适配的最新稳定版;如果是.NET Framework项目,选择对应兼容的版本。

  • 模板内的类型引用错误:你的TraderDeletedEmail.cshtml模板里如果用到了某些未正确引入的类型(比如自定义扩展方法、第三方类库),RazorLight在编译模板时找不到对应的类型,就会抛出这类异常。可以打开模板文件,检查所有@using指令是否齐全,用到的类型所在的程序集是否已经被项目引用。

  • 文件权限或临时目录问题:虽然你确认了模板路径有效,但RazorLight编译模板时会生成临时文件到系统临时目录(默认是%TEMP%\RazorLight),如果当前程序的运行权限不足(比如IIS应用池权限过低),可能导致临时文件无法写入或读取,进而引发类型加载失败。你可以尝试手动指定一个程序有权限访问的缓存目录,或者给默认临时目录添加读写权限。

  • 重复依赖冲突:如果你的项目中同时引用了多个版本的Razor相关程序集(比如Microsoft.AspNetCore.Razor.Runtime存在两个版本),会导致类型加载冲突。可以在NuGet包管理器的“已安装”标签里检查重复的依赖,卸载多余的版本,确保所有相关包版本一致。

  • 编译缓存损坏:RazorLight会缓存编译好的模板,有时候缓存文件损坏会导致加载异常。你可以手动删除%TEMP%\RazorLight目录下的所有文件,然后重新运行程序,让RazorLight重新编译模板。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:12:46