C# 如何在ASP.NET Core 2.0中预编译视图?

C# 如何在ASP.NET Core 2.0中预编译视图?,c#,razor,asp.net-core,asp.net-core-mvc,asp.net-core-2.0,C#,Razor,Asp.net Core,Asp.net Core Mvc,Asp.net Core 2.0,我根据这个设置了我的解决方案。我省略了一些内容,因为根据,默认情况下ASP.NET Core 2.0预编译视图。最后,我将其发布到一个文件夹,该文件夹成功结束,但我的precompiledviews.dll丢失。我尝试在.csproj中显式设置它,但没有成功 编辑:解决方案中的两个项目都只是默认的MVC模板。我打赌您会使用,即使用类似于的命令发布 dotnet发布--配置发布--运行时win-x64 这将生成包含所有依赖项(包括.NET核心二进制文件)的可执行文件 该条载有以下警告: 当前在执行

我根据这个设置了我的解决方案。我省略了一些内容,因为根据,默认情况下ASP.NET Core 2.0预编译视图。最后,我将其发布到一个文件夹,该文件夹成功结束,但我的precompiledviews.dll丢失。我尝试在.csproj中显式设置它,但没有成功

编辑:解决方案中的两个项目都只是默认的MVC模板。

我打赌您会使用,即使用类似于的命令发布

dotnet发布--配置发布--运行时win-x64

这将生成包含所有依赖项(包括.NET核心二进制文件)的可执行文件

该条载有以下警告:

当前在执行操作时,Razor视图预编译不可用 ASP.NET Core 2.0中的自包含部署(SCD)。该功能将 当2.1版本发布时,可用于SCD

因此,如果要使用预编译的Razor视图,应使用,即使用以下命令发布:

dotnet发布--配置发布

在这种情况下,Razor视图是预编译的(默认情况下),您将在其他应用程序二进制文件中找到
YourAppName.PrecompiledViews.dll

更新(用于库项目中的预编译视图)

我最初的回答与通常的ASP.NET核心MVC应用程序有关,但是这个问题特定于包含预编译视图(又称自包含UI)的项目库

ASP.NET Core在发布期间默认预编译视图,但对于库项目中存储的视图,情况并非如此。对这个问题有一个专门的解决办法。这一讨论相当长,但得出的结论是,目前我们仍然需要使用带有定制目标的解决方案进行Razor视图预编译。这基本上与问题所引用的方法相同

我已经使用
ChildApplication
和main
mvcapapplication
设置了测试解决方案,并使预编译视图同时适用于构建和发布

以下是用于
儿童应用程序的csproj(跳过默认ASP.NET核心MVC项目的部分):

Dean North在中添加了对具有预编译视图的程序集的直接引用

<ItemGroup>
    <Reference Include="DashboardExample.PrecompiledViews">
        <HintPath>..\DashboardExample\bin\Debug\netcoreapp1.1\DashboardExample.PrecompiledViews.dll</HintPath>
    </Reference>
</ItemGroup>

..\DashboardExample\bin\Debug\netcoreapp1.1\DashboardExample.precompiledwiews.dll
这种方法并不完美,因为它使用了使用特定配置构建的程序集(
Debug
)。在上面的项目文件中,我使用单独的目标,在构建和发布期间复制
ChildApplication.PrecompiledViews.dll


下面是父项目和子项目。

我通常只是将它们添加到
.csproj
中。不需要复制文件或任何乱七八糟的东西

    <PropertyGroup>
       <TargetFramework>netcoreapp2.2</...
       ...
       <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
       <PreserveCompilationContext>true</PreserveCompilationContext>
    </PropertyGroup>

    <ItemGroup>
        ...
       <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.2.0" />    
    </ItemGroup>


netcoreapp2.2实际上,我是用这个命令发布的。它确实成功地结束了,但仍然没有预编译视图。哇,感谢您提供的示例解决方案。我下载了它,试着发布它。我得到一条错误消息,ChildApplication.PrecompiledViews.dll无法复制,因为它不存在。是的,它并不存在。我遗漏了什么吗?您是否在
mvcapapplication
目录下运行
dotnet publish-c Release
命令?这对我来说非常好。下面是一个示例,请与您运行的输出进行比较。它正在工作,但奇怪的是,precompiledviews.dll仍然找不到。不应该存在吗?具有预编译视图的程序集的名称将为
ChildApplication.PrecompiledViews.dll
mvcapApplication.PrecompiledViews.dll
。请重新检查,它们应该在那里。您的
TargetFramework
是什么?您是否尝试过隐式地将
MVCranchorCompileOnPublish
设置为true?@set,它是Core 2.0,是的,我尝试过将MVCranchorCompileOnPublish设置为true。我在下面的文章中看到,将此值设置为true将禁用Razor SDK。如果我想迁移到Razor SDK,视图的预编译是否会在不将MvcRazorCompileOnPublish指定为true的情况下立即进行?
<ItemGroup>
    <Reference Include="DashboardExample.PrecompiledViews">
        <HintPath>..\DashboardExample\bin\Debug\netcoreapp1.1\DashboardExample.PrecompiledViews.dll</HintPath>
    </Reference>
</ItemGroup>
    <PropertyGroup>
       <TargetFramework>netcoreapp2.2</...
       ...
       <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
       <PreserveCompilationContext>true</PreserveCompilationContext>
    </PropertyGroup>

    <ItemGroup>
        ...
       <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.2.0" />    
    </ItemGroup>