ASP.NET Core 5非Web应用类库项目引用Razor的正确方法咨询
非Web项目.NET 5+引用Razor的正确方案
针对类库、控制台等非Web场景需要使用Razor渲染功能的需求,有两种经过验证的可行方案:
方案1:官方原生方案(推荐,兼容原有模板逻辑)
.NET 5+ 允许非Web项目直接引用ASP.NET Core共享框架,不会额外引入Web服务相关的冗余组件,原有Razor逻辑几乎不需要修改:
- 修改类库项目的
.csproj文件配置:- 将项目SDK修改为
Microsoft.NET.Sdk.Razor - 移除原有两个
Microsoft.AspNetCore.Mvc.Razor、Microsoft.AspNetCore.Mvc.ViewFeatures的包引用 - 添加ASP.NET Core框架引用,保留编译上下文配置
完整示例配置片段:
<Project Sdk="Microsoft.NET.Sdk.Razor"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <PreserveCompilationContext>true</PreserveCompilationContext> </PropertyGroup> <ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> </Project> - 将项目SDK修改为
- 注册Razor相关服务,在你类库的初始化逻辑或使用方的依赖注入配置中添加如下代码:
services.AddMvcCore() .AddRazorViewEngine(); - 后续使用Razor渲染HTML的逻辑和原有.NET Framework 4.8时期的写法完全一致。
方案2:轻量级第三方库方案(无ASP.NET Core依赖)
如果不想引入ASP.NET Core共享框架,可以使用专门封装的Razor渲染库,无需额外配置框架引用:
- 安装NuGet包
RazorLight - 直接调用API渲染模板,示例代码:
var engine = new RazorLightEngineBuilder() .UseEmbeddedResourcesProject(typeof(YourClass).Assembly) .UseMemoryCachingProvider() .Build(); string html = await engine.CompileRenderAsync("TemplateName.cshtml", model);
注:方案1的兼容性更好,和原有.NET Framework时期的Razor模板语法完全兼容,迁移成本更低;方案2更轻量化,适合仅需要简单Razor渲染的场景。
内容的提问来源于stack exchange,提问作者Fabian Schmied
相关产品推荐
相关产品推荐

