.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 项目中使用嵌入式资源,请执行以下操作:
照常添加您的嵌入文件。
示例:名为“_fonts”的目录中的一些字体文件
修改 "project.json" 以包含相关资源。
就我而言:
"buildOptions": {
"embed": {
"include": [
"_fonts/*.ttf"
]
}
},
访问代码中的嵌入资源。
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");
- 参数:嵌入文件名;类型:来自目标资源程序集的任何 class
- 寻找具有该名称的嵌入资源
- 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 是位图对象。
我刚刚开始研究 .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 项目中使用嵌入式资源,请执行以下操作:
照常添加您的嵌入文件。
示例:名为“_fonts”的目录中的一些字体文件
修改 "project.json" 以包含相关资源。
就我而言:
"buildOptions": { "embed": { "include": [ "_fonts/*.ttf" ] } },
访问代码中的嵌入资源。
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");
- 参数:嵌入文件名;类型:来自目标资源程序集的任何 class
- 寻找具有该名称的嵌入资源
- 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 是位图对象。