--- 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: 03/02/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, will complement build time compilation allowing Razor files to be updated if they are editied. ::: 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 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 application's `ConfigureServices` to include a call to `AddMvcRazorRuntimeCompilation`: ```csharp services .AddMvc() .AddRazorRuntimeCompilation() ``` For runtime compilation to work when deployed, apps must modify their project files to set the `PreserveCompilationReferences` to `true`: [!code-xml[](view-compilation/sample/RuntimeCompilation.csproj?highlight=4)] ::: 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