Popular blog tags

Asp .Net Core Razor 预编译,动态编译,混合编译

Published

预编译

预编译是ASP .Net Core的默认方式。在发布时,默认会将系统中的所有Razor视图进行预编译。编译好的视图DLL统一命名为 xxx.PrecompiledViews.dll 或者 xxx.Views.dll

动态编译

Net 5.X 配置:

Add

<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.0-rc.2.20475.17" />

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.0-rc.2.20475.17" />  //add here
  </ItemGroup>

</Project>

.Net Core 2.x

将项目整个配置成动态编译很简单,添加一个配置项目MvcRazorCompileOnPublish,值为false即可

<PropertyGroup>
  <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
</PropertyGroup>

在发布的时候,所有的Razor视图都不会被预编译了,并且所有的视图都会一同被发布。

混合编译

预编译和动态编译都有各自的优点,你可以选择将它们混合起来使用。例如如果你希望在发布时只预编译部分视图,而部分视图要采用动态编译的模式,可以在项目文件上配置排除不需要预编译的视图。例如将Views目录下的全部进行预编译,而主题目录和邮件模板目录下的视图不需要预编译:

<ItemGroup>
  <MvcRazorFilesToCompile Include="Views\**\*.cshtml" Exclude="wwwroot\themes\**\*.cshtml;EmailTemplates\**\*.cshtml" />
</ItemGroup>

.net core 3.0视图动态编译

asp.net 3.0中没有cshtml动态编译的功能了.

ASP.NET Core 3.0 shared framework中不再依赖Roslyn,也就失去了视图动态编译的能力,发布了一个nuget扩展包来支持该功能。

安装 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 包。
更新应用程序的 ConfigureServices 以包含对 AddMvcRazorRuntimeCompilation 的调用:
 

services.AddMvc()
        .AddRazorRuntimeCompilation();

不过,这种方式仍然会将视图编译为dll,如果需要保留cshtml文件,仍然需要在加入 csproj 工程文件中加入相应的编译选项,如:

<PropertyGroup>
    <RazorCompileOnBuild>false</RazorCompileOnBuild>
    <RazorCompileOnPublish>false</RazorCompileOnPublish>
  </PropertyGroup>