.Net Core库中的嵌入式资源

Don*_*ato 53 c# .net-core asp.net-core

我刚刚开始研究.Net Core,我没有看到经典资源和任何看似资源的东西.在经典的.Net类库中,我能够将带有一些脚本的文本过滤添加到我的项目中,而不是将这些文件添加到项目的资源中.之后我可以通过以下方式轻松使用它:

Connection.Execure(Properties.Resources.MySuperScript);
Run Code Online (Sandbox Code Playgroud)

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

小智 80

更新:

.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>
Run Code Online (Sandbox Code Playgroud)

可能有类似的*.tff形式; 未经证实.

步骤1和3保持不变.


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

1.-像往常一样添加您的嵌入文件.

示例:名为"_fonts"的目录上的一些FONT文件

在此输入图像描述

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

就我而言:

 "buildOptions": {
    "embed": {
      "include": [
        "_fonts/*.ttf"    
      ]
    } 
  },
Run Code Online (Sandbox Code Playgroud)

3.-访问代码中的嵌入式资源.

var assembly = typeof(MyLibrary.MyClass).GetTypeInfo().Assembly;
Stream resource = assembly.GetManifestResourceStream("MyLibrary._fonts.OpenSans.ttf");
Run Code Online (Sandbox Code Playgroud)

关键是在"GetManifestResourceStream"调用上使用正确的名称.您必须使用[程序集名称].[目录].[文件名].

希望它可以帮助那些人^ _ ^.

  • 为了确保获取正确的资源,请评估目标程序集中可用的所有资源`string [] names = assembly.GetManifestResourceNames();` (27认同)
  • 看起来资源名称的格式使用了程序集的“默认名称空间”,而不是程序集名称。但是,如上所述,仍以点分隔。 (2认同)

Dre*_*kes 46

现在project.json不推荐使用,您必须在.csproj文件中指定它.

<ItemGroup>
    <EmbeddedResource Include="_fonts\*.ttf" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

您可以使用如图所示的通配符,也可以只显式列出文件.

  • 如果没有随后如何获取数据的详细信息,这用处不大。 (4认同)
  • @JimAho文件嵌入在程序集中。 (3认同)

Mar*_*ani 29

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

dotnet add package Microsoft.Extensions.FileProviders.Embedded
Run Code Online (Sandbox Code Playgroud)

EmbeddedFileProvider允许您创建一个流阅读器,并使用根据您的情况:

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

  • GetFileInfo() 的文件格式为“{Folder}.{filename}.{Extension}”,不带命名空间。这与 assembly.GetManifestResourceStream() 不同,后者使用文件格式“{Namespace}.{Folder}.{filename}.{Extension}”(包括命名空间) (2认同)

Dan*_*ann 5

人们通常已经回答了这个问题,所以这是将答案简化为简单的结果。

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

用法

var myJsonFile = ReadManifestData<Tests>("myJsonFile.json");
Run Code Online (Sandbox Code Playgroud)
  1. 参数:嵌入式文件名;类型:目标资源的程序集中的任何类
  2. 寻找具有该名称的嵌入式资源
  3. 返回字符串值

方法

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)