我刚刚开始研究.Net Core,我没有看到经典资源和任何看似资源的东西。在经典的.Net类库中,我能够将带有一些脚本的文本过滤添加到我的项目中,而不是将这些文件添加到项目的资源中。之后,我可以通过以下方式轻松使用它:
Connection.Execure(Properties.Resources.MySuperScript);
我看到.Net Core库中没有这样的功能,至少我看不到。 在.Net Core中是否有替代方法可以将一些静态数据存储为库中的嵌入式资源?如果它存在,如何使用它?
答案 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文件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");
方法
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)