.Net Core 库中的嵌入式资源

Embedded resource in .Net Core libraries

我刚刚开始研究 .Net Core,但我没有看到 classical 资源和任何看起来像资源的东西。在 classical .Net class 库中,我能够将带有一些脚本的文本过滤器添加到我的项目中,然后我可以将这些文件添加到项目的资源中。之后我可以通过以下方式轻松使用它:

Connection.Execure(Properties.Resources.MySuperScript);

我看到.Net Core 库中没有这样的功能,至少我没有看到。 .Net Core 中是否有替代方法将一些静态数据存储为库中的嵌入式资源?如果它存在,如何使用它?

更新:

.NET Core 1.1 及更高版本已删除 project.json 并返回到 .csproj 文件。 这改变了第 2 步,但变化不大。必要的行非常相似:

<ItemGroup>
  <Content Remove="_fonts/OpenSans.ttf" />
  <Content Remove="_fonts/OpenSans-Bold.ttf" />
  <Content Remove="_fonts/OpenSans-Italic.ttf" />
</ItemGroup>
<ItemGroup>
  <EmbeddedResource Include="_fonts/OpenSans.ttf" />
  <EmbeddedResource Include="_fonts/OpenSans-Bold.ttf" />
  <EmbeddedResource Include="_fonts/OpenSans-Italic.ttf" />
</ItemGroup>

可能有类似*.tff的形式;未确认。

步骤 1 和 3 不变。


要在 .NET Core 1.0 项目中使用嵌入式资源,请执行以下操作:

  1. 照常添加您的嵌入文件。

    示例:名为“_fonts”的目录中的一些字体文件

  2. 修改 "project.json" 以包含相关资源。

    就我而言:

     "buildOptions": {
        "embed": {
          "include": [
            "_fonts/*.ttf"    
          ]
        } 
      },
    
  3. 访问代码中的嵌入资源。

    var assembly = typeof(MyLibrary.MyClass).GetTypeInfo().Assembly;
    Stream resource = assembly.GetManifestResourceStream("MyLibrary._fonts.OpenSans.ttf");
    

    关键是在 GetManifestResourceStream 调用中使用正确的名称。你必须使用 [assembly name].[directory].[file name].

现在 project.json 已弃用,您必须在 .csproj 文件中指定它。

<ItemGroup>
    <EmbeddedResource Include="_fonts\*.ttf" />
</ItemGroup>

您可以使用如图所示的通配符,或者直接列出文件。

人们已经普遍回答了这个问题,所以这是一个简单的答案渲染。

在使用以下内容之前,应将文件作为嵌入资源添加到 .csproj / project.json

用法

var myJsonFile = ReadManifestData<Tests>("myJsonFile.json");
  1. 参数:嵌入文件名;类型:来自目标资源程序集的任何 class
  2. 寻找具有该名称的嵌入资源
  3. returns 字符串值

方法

public static string ReadManifestData<TSource>(string embeddedFileName) where TSource : class
{
    var assembly = typeof(TSource).GetTypeInfo().Assembly;
    var resourceName = assembly.GetManifestResourceNames().First(s => s.EndsWith(embeddedFileName,StringComparison.CurrentCultureIgnoreCase));

    using (var stream = assembly.GetManifestResourceStream(resourceName))
    {
        if (stream == null)
        {
            throw new InvalidOperationException("Could not load manifest resource stream.");
        }
        using (var reader = new StreamReader(stream))
        {
            return reader.ReadToEnd();
        }
    }
}

对于较新版本的 .Net Core - 2.0 或更高版本 - 有一个专门的 class EmbeddedFileProvider 来抽象嵌入式文件读取。要使用它,请将 Microsoft.Extensions.FileProviders.Embedded 包添加到您的应用程序中:

dotnet add package Microsoft.Extensions.FileProviders.Embedded

EmbeddedFileProvider允许您创建流reader,并根据您的场景使用:

var embeddedProvider = new EmbeddedFileProvider(Assembly.GetExecutingAssembly());
using (var reader = embeddedProvider.GetFileInfo("yourfile.ext").CreateReadStream())
{
  // some logic with stream reader
}

我没有在文档中证实这一点,但对我来说,似乎自动生成的资源代码检索在 Resource.Designer.cs 中找到的嵌入文件现在在 .NET Core 3.1 中再次运行。我现在可以通过调用 Properties.Resources.MyImageName 来检索嵌入的 jpg,其中 returns 是位图对象。