将 wwwroot 的内容从类库复制到托管程序集

Posted

技术标签:

【中文标题】将 wwwroot 的内容从类库复制到托管程序集【英文标题】:copy contents of wwwroot from class library to hosting assembly 【发布时间】:2021-02-02 16:04:48 【问题描述】:

我有 razor 类库,其中包含 wwwroot 文件夹和一些静态资产(我们称之为 MyWeb.Reports 项目,因为它将用于使用 razor 作为生成器创建静态 html 报告)。

我还有使用该 dll 的 asp.net 核心托管应用程序(我们称之为 MyWeb)(引用首先在 Visual Studio-MyWeb.Reports 中提到的项目)。类库的目的是生成静态 HTML 文件(它呈现 razor 组件)

我希望能够将 HTML 中的 CSS 呈现为内联字符串,因为 HTML 文件必须是独立的(一旦呈现 html,就不会向任何服务器发出额外请求)。

我的想法是在 razor 组件中使用类似 File.ReadAllText("~/styles.css") 的东西。 如果 styles.css 位于 asp.net 核心网络应用程序的 wwwroot 文件夹中,这将起作用。

web 应用内的组件库和类库内的组件都有 css 感觉很奇怪。

请记住,我不是在这里创建网络应用程序(网络应用程序项目中没有组件)。 它只是调用 Web.Reports.dll 将生成 HTML,而 MyWeb 将只有控制器,它将返回生成的字符串(流)。

是否可以将引用项目中的 wwwroot 复制到实际托管的项目中?

【问题讨论】:

您使用的是什么版本的 .Net。该库是 Razor 类库吗?由于引用类库资源已更改,Blazor 的版本是什么? . 检查this article:ASP.NET Core 允许创建包含可供消费应用程序使用的静态资产的 RCL。打包 RCL 时,wwwroot 文件夹中的所有伴随资产都会自动包含在包中。此外,您还可以查看这篇文章:Including Static Resources In Razor Class Libraries In ASP.NET Core. 【参考方案1】:

这篇文章https://dotnetstories.com/blog/How-to-Include-static-files-in-a-Razor-library-en-7156675136 描述了如何从 Razor 类库访问文件。

在你的 razor 类库 csproj 中:

    添加 GenerateEmbeddedFilesManifest 标志 参考 Microsoft.Extensions.FileProviders.Embedded 将 wwwroot 包含为 EmbeddedResource

例子:

<PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="5.0.0-rc.2.*" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="5.0.0-rc.2.*" PrivateAssets="all" />
    <PackageReference Include="System.Net.Http.Json" Version="5.0.0-rc.2.*" />
    <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="5.0.0-rc.2.*" />  

  </ItemGroup>

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

然后你可以这样做:

var assembly = typeof(Library.Class1).Assembly;
var filePaths = assembly.GetManifestResourceNames().Where(rnn => rnn.Contains("wwwroot"));

foreach (var path in filePaths)

   Console.WriteLine(path);

【讨论】:

以上是关于将 wwwroot 的内容从类库复制到托管程序集的主要内容,如果未能解决你的问题,请参考以下文章

我想将工件部署或复制到 azure app 服务的 wwwroot 内的子文件夹

linux怎么删除指定目录的内容?

C# 从类库中获取资源图片,把图片资源保存到类库中

从类库中访问文件

从类库注册 Web API 控制器

从类库访问用户上下文