如果文件很小,项目资源文件可以像其他人描述的那样使用,但这样文件只能作为 Unicode 字符串检索,可能/可能比原始文件大两倍并立即加载到内存中完整的。
原始问题中提到的方法是将文本文件放在项目中的某个位置,在解决方案资源管理器中选择它,按 F4 显示属性,然后将 Build Action 设置为 嵌入资源并在请勿复制处留下复制到输出目录。
这与添加到您的 .csproj 相同:
<ItemGroup>
<EmbeddedResource Include="Resources\TextFile.txt"/>
</ItemGroup>
那么您将需要正确的Assembly 或IFileProvider 的实例来按名称访问这些资源。
通过组装:
typeof(Program).Assembly.GetManifestResourceNames()
typeof(Program).Assembly.GetManifestResourceStream(name)
typeof(Program).Assembly.GetManifestResourceInfo(name)
这些名称是类似的类名,以点分隔。如果您的项目是NamespaceName.ProjectName,则资源文件在Resources 子文件夹中,名为TextFile.txt,资源名称将是
NamespaceName.ProjectName.Resources.TextFile.txt
GetManifestResourceStream 有一个重载,它接受一个类型,所以你可以这样做
typeof(Program).Assembly.GetManifestResourceStream(
typeof(Program),
"Resources.TextFile.txt")
从不依赖默认命名空间或项目输出文件名。
这些方法的缺点是它们似乎无法在监视窗口中工作。你可能会遇到异常
System.ArgumentException "Cannot evaluate a security function."
在这种情况下,只需将代码编写到您可以随意执行的地方 - 例如在静态方法中。这样代码就从你的程序集中运行,而不是调试器。
通过IFileProvider:
dotnet add package Microsoft.Extensions.FileProviders.Embedded
using Microsoft.Extensions.FileProviders;
var fp = new EmbeddedFileProvider(typeof(Program).Assembly);
// get all resources as an enumerable
foreach (var fileInfo in fp.GetDirectoryContents(""))
Console.WriteLine($"Name: {fileInfo.Name}, Length: {fileInfo.Length}, ...");
// get a specific one by name
var stream = fp.GetFileInfo("Resources.TextFile.txt").CreateReadStream();
作为IFileProvider,您可能会尝试从纯嵌入式资源托管 .NET Core 网站。