.Net Core库中的嵌入式资源

时间:2016-08-04 08:36:04

标签: c# asp.net-core .net-core

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

Connection.Execure(Properties.Resources.MySuperScript);

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

6 个答案:

答案 0 :(得分:61)

<强>更新

.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.-像往常一样添加您的嵌入文件。

示例:名为&#34; _fonts&#34;

的目录上的一些FONT文件

enter image description here

2.-修改&#34; project.json&#34;包括相关资源。

就我而言:

 "buildOptions": {
    "embed": {
      "include": [
        "_fonts/*.ttf"    
      ]
    } 
  },

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

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

关键是在&#34; GetManifestResourceStream&#34;上使用正确的名称。呼叫。您必须使用[程序集名称]。[目录]。[文件名]。

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

答案 1 :(得分:46)

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

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

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

答案 2 :(得分:7)

使用.Net Core 2.0或更高版本的较新版本时,有一个专门的类sbt可以对嵌入式文件的读取进行抽象。要使用它,请将EmbeddedFileProvider软件包添加到您的应用程序中:

Microsoft.Extensions.FileProviders.Embedded

dotnet add package Microsoft.Extensions.FileProviders.Embedded 允许您创建流读取器,并根据您的情况使用:

EmbeddedFileProvider

答案 3 :(得分:3)

我在文档中没有对此进行确认,但是对我来说,它似乎是自动生成的资源代码,用于检索Resource.Designer.cs中的嵌入式文件,现在在.NET Core 3.1中再次起作用。现在,只需调用返回一个Bitmap对象的Properties.Resources.MyImageName即可检索嵌入的jpg。

答案 4 :(得分:1)

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

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

用法

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

方法

public static string ReadManifestData<TSource>(string embeddedFileName) where T: 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();
        }
    }
}

答案 5 :(得分:-2)

只需使用文件在项目中创建一个子文件夹。

在属性中,将文件设置为“嵌入式资源”和“如果更新则复制”。 enter image description here

它们将被发布,文件夹和文件将被创建,您可以像这样访问它们:

var mySuperScript= File.ReadAllText(System.IO.Directory.GetCurrentDirectory() + @"\folder\MySuperScript.js")