--- title: Razor file compilation in ASP.NET Core author: rick-anderson description: Learn how compilation of Razor files occurs in an ASP.NET Core app. monikerRange: '>= aspnetcore-1.1' ms.author: riande ms.custom: mvc ms.date: 06/20/2019 uid: mvc/views/view-compilation --- # Razor file compilation in ASP.NET Core By [Rick Anderson](https://twitter.com/RickAndMSFT) ::: moniker range="= aspnetcore-1.1" A Razor file is compiled at runtime, when the associated MVC view is invoked. Build-time Razor file publishing is unsupported. Razor files can optionally be compiled at publish time and deployed with the app—using the precompilation tool. ::: moniker-end ::: moniker range="= aspnetcore-2.0" A Razor file is compiled at runtime, when the associated Razor Page or MVC view is invoked. Build-time Razor file publishing is unsupported. Razor files can optionally be compiled at publish time and deployed with the app—using the precompilation tool. ::: moniker-end ::: moniker range=">= aspnetcore-2.1 <= aspnetcore-2.2" A Razor file is compiled at runtime, when the associated Razor Page or MVC view is invoked. Razor files are compiled at both build and publish time using the [Razor SDK](xref:razor-pages/sdk). ::: moniker-end ::: moniker range=">= aspnetcore-3.0" Razor files are compiled at both build and publish time using the [Razor SDK](xref:razor-pages/sdk). Runtime compilation may be optionally enabled by configuring your application. ::: moniker-end ## Razor compilation ::: moniker range=">= aspnetcore-3.0" Build- and publish-time compilation of Razor files is enabled by default by the Razor SDK. When enabled, runtime compilation complements build-time compilation, allowing Razor files to be updated if they are edited. ::: moniker-end ::: moniker range=">= aspnetcore-2.1 <= aspnetcore-2.2" Build- and publish-time compilation of Razor files is enabled by default by the Razor SDK. Editing Razor files after they're updated is supported at build time. By default, only the compiled *Views.dll* and no *.cshtml* files or references assemblies required to compile Razor files are deployed with your app. > [!IMPORTANT] > The precompilation tool has been deprecated, and will be removed in ASP.NET Core 3.0. We recommend migrating to [Razor Sdk](xref:razor-pages/sdk). > > The Razor SDK is effective only when no precompilation-specific properties are set in the project file. For instance, setting the *.csproj* file's `MvcRazorCompileOnPublish` property to `true` disables the Razor SDK. ::: moniker-end ::: moniker range="= aspnetcore-2.0" If your project targets .NET Framework, install the [Microsoft.AspNetCore.Mvc.Razor.ViewCompilation](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Razor.ViewCompilation/) NuGet package: [!code-xml[](view-compilation/sample/DotNetFrameworkProject.csproj?name=snippet_ViewCompilationPackage)] If your project targets .NET Core, no changes are necessary. The ASP.NET Core 2.x project templates implicitly set the `MvcRazorCompileOnPublish` property to `true` by default. Consequently, this element can be safely removed from the *.csproj* file. > [!IMPORTANT] > The precompilation tool has been deprecated, and will be removed in ASP.NET Core 3.0. We recommend migrating to [Razor Sdk](xref:razor-pages/sdk). > > Razor file precompilation is unavailable when performing a [self-contained deployment (SCD)](/dotnet/core/deploying/#self-contained-deployments-scd) in ASP.NET Core 2.0. ::: moniker-end ::: moniker range="= aspnetcore-1.1" Set the `MvcRazorCompileOnPublish` property to `true`, and install the [Microsoft.AspNetCore.Mvc.Razor.ViewCompilation](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Razor.ViewCompilation/) NuGet package. The following *.csproj* sample highlights these settings: [!code-xml[](view-compilation/sample/MvcRazorCompileOnPublish.csproj?highlight=4,10)] ::: moniker-end ::: moniker range="<= aspnetcore-2.0" Prepare the app for a [framework-dependent deployment](/dotnet/core/deploying/#framework-dependent-deployments-fdd) with the [.NET Core CLI publish command](/dotnet/core/tools/dotnet-publish). For example, execute the following command at the project root: ```console dotnet publish -c Release ``` A *\.PrecompiledViews.dll* file, containing the compiled Razor files, is produced when precompilation succeeds. For example, the screenshot below depicts the contents of *Index.cshtml* within *WebApplication1.PrecompiledViews.dll*: ![Razor views inside DLL](view-compilation/_static/razor-views-in-dll.png) ::: moniker-end ## Runtime compilation ::: moniker range="= aspnetcore-2.1" Build-time compilation is supplemented by runtime compilation of Razor files. ASP.NET Core MVC will recompile Razor files when the contents of a *.cshtml* file change. ::: moniker-end ::: moniker range="= aspnetcore-2.2" Build-time compilation is supplemented by runtime compilation of Razor files. The gets or sets a value that determines if Razor files (Razor views and Razor Pages) are recompiled and updated if files change on disk. The default value is `true` for: * If the app's compatibility version is set to or earlier * If the app's compatibility version is set to or later and the app is in the Development environment . In other words, Razor files would not recompile in non-Development environment unless is explicitly set. For guidance and examples of setting the app's compatibility version, see . ::: moniker-end ::: moniker range=">= aspnetcore-3.0" Runtime compilation is enabled using the `Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation` package. To enable runtime compilation, apps must: * Install the [Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/) NuGet package. * Update the project's `Startup.ConfigureServices` method to include a call to `AddRazorRuntimeCompilation`: ```csharp services .AddControllersWithViews() .AddRazorRuntimeCompilation(); ``` ::: moniker-end ## Additional resources ::: moniker range="= aspnetcore-1.1" * ::: moniker-end ::: moniker range="= aspnetcore-2.0" * * ::: moniker-end ::: moniker range=">= aspnetcore-2.1" * * * ::: moniker-end