将 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 的内容从类库复制到托管程序集的主要内容,如果未能解决你的问题,请参考以下文章