.Net Core 项目类型,用于与多个项目共享布局

Posted

技术标签:

【中文标题】.Net Core 项目类型,用于与多个项目共享布局【英文标题】:.Net Core project type used to share layout with multiple projects 【发布时间】:2019-07-08 20:15:45 【问题描述】:

目前我有一个 Razor 类库,它生成一个 .net 标准项目。在这个项目中,我有我的 _Layout.cshtml 和我与其他 .net 核心项目共享的其他页面。

虽然所有这些都有效,但当我还需要在不同项目之间共享我的模型时,我遇到了一个问题。我将模型及其迁移提取到一个单独的类库中(由于迁移文件,该项目是一个 .net 核心类库)。此时一切都还可以,但是一旦我需要从布局项目中引用实体类库,我就无法这样做,因为 .net 标准项目无法引用 .net 核心项目(原因很明显)。

由于这些要求,我认为最好将布局项目设为 .net 核心项目而不是 .net 标准项目,这样我在引用项目时不会遇到任何问题。我不需要从任何其他非 .net 核心的项目中访问布局项目,因此我不需要 .net 标准提供的兼容性。

无论如何,我目前面临的问题是 Web 应用程序无法看到 _Layout.cshtml 文件来加载它。我正在使用与我的标准库完全相同的代码。下面是我在尝试运行应用程序时遇到的行和错误:

var filesProvider = new ManifestEmbeddedFileProvider(GetType().Assembly, "resources");

System.InvalidOperationException:'无法为程序集'MyLayoutProject'加载嵌入文件清单'Microsoft.Extensions.FileProviders.Embedded.Manifest.xml'。'

是否需要进行任何修改才能完成这项工作?这甚至可能吗?有什么其他想法可以让我完成这项工作?

更新

下面是共享布局项目的.csproj(我在nuget包之后在底部添加了GenerateEmbeddedFilesManifest和ItemGroups)

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="bootstrap" Version="4.3.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.2.0" />
    <PackageReference Include="Microsoft.NET.Sdk.Razor" Version="2.2.0" />
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.1" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
  </ItemGroup>

  <ItemGroup>
    <Content Update="Areas\Features\Pages\Shared\_Layout.cshtml">
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Features\Pages\_ViewStart.cshtml">
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Include="Resources\**\*" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Remove="Resources\js\jquery-3.3.1.min.js" />
  </ItemGroup>
</Project>

通过此更新,原始错误消息消失了,但布局根本不会加载。

【问题讨论】:

【参考方案1】:

我能够通过删除所有更改并使用原始 .net 标准类库项目来完成此操作。我所做的是编辑 csproj 并将项目类型更改为 netcoreapp2.2。它似乎正在处理那个微小的变化......

<TargetFramework>netcoreapp2.2</TargetFramework>

【讨论】:

以上是关于.Net Core 项目类型,用于与多个项目共享布局的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET Core 类库中引用 Visual Studio 共享项目

.net core 共享 .Net Forms Authentication cookie

微软 .NET Core 3.1 年底将结束支持,请升级到.NET 6

如何对接一个使用其他两个项目的主要 .NET Core 项目?

.NET Core 和 .NET 标准类库项目类型有啥区别?

.NET 和 .NET Core 项目的单一类库项目