Properties.Resources.MyTextFile可直接获取字符串资源,但需确保资源类型为String;若为Embedded Resource,则需用Assembly.GetExecutingAssembly().GetManifestResourceStream()配合正确资源名和Encoding.UTF8读取。

怎么用 Properties.Resources 读纯文本资源
直接从 Properties.Resources 读取文本资源最简单,但前提是资源文件里该条目类型设为 String(不是 Embedded Resource)。VS 默认新建的字符串资源会自动编译进程序集,调用时零配置:
-
Properties.Resources.MyTextFile就是 string 类型,直接用,不用解包、不用流操作 - 如果资源名含空格或特殊字符,VS 会自动生成合法 C# 成员名(比如
My_Text_File),别手敲原始文件名 - 注意:这个方式只适用于“文本内容本身被存为字符串常量”,不是把 .txt 文件整个嵌入——后者走的是
Assembly.GetExecutingAssembly().GetManifestResourceStream()
为什么 GetManifestResourceStream 返回 null
这是最常见的坑:明明资源文件属性设成了 Embedded Resource,GetManifestResourceStream 却返回 null。根本原因几乎全是资源名称不对:
- 资源名不是文件名,而是
默认命名空间.文件夹路径.文件名,比如项目默认命名空间是MyApp,资源放在Resources/notes.txt,那完整名是MyApp.Resources.notes.txt - 右键资源文件 → “属性” → 确认
生成操作是Embedded Resource,且复制到输出目录是不复制(否则会多出一个同名文件干扰判断) - 调试时可用
Assembly.GetExecutingAssembly().GetManifestResourceNames()打印所有真实资源名,比猜强得多
StreamReader 读取嵌入文本时的编码问题
用 GetManifestResourceStream 拿到流后,别直接用 StreamReader 默认构造函数——它按 UTF-8 BOM 判断编码,而 VS 嵌入的文本资源默认是 UTF-8 无 BOM,容易乱码:
- 显式指定编码:
new StreamReader(stream, Encoding.UTF8)(推荐)或Encoding.Default(仅兼容旧项目) - 如果原始文本是 ANSI(比如记事本另存为“ANSI”),得用
Encoding.Default,但跨机器可能不稳定 - 更稳的做法:统一用 UTF-8 并带 BOM 保存源文本文件,VS 能正确识别;或者干脆改用
Encoding.UTF8.GetString(stream.ReadAllBytes())避开 StreamReader
资源名大小写和路径斜杠在不同平台是否敏感
Windows 下开发时资源名大小写不敏感,但发布到 Linux(如 .NET 6+ 容器)就会报错——GetManifestResourceStream 在 Unix-like 系统严格区分大小写:
- 资源名里的文件夹分隔符必须是点号
.,不是反斜杠\或正斜杠/(哪怕你在资源管理器里看到的是文件夹结构) - 检查
GetManifestResourceNames()输出,确认实际注册的名是全小写还是带大写——VS 有时会按文件系统原样保留大小写 - CI/CD 流水线跑在 Linux 上时,这问题第一轮就暴露,别等部署完才查
资源名拼写和编码这两个点,实际排障时间占八成以上。写死的字符串最容易漏掉大小写或点号,而 StreamReader 不传编码参数,本地跑得通,上线就变问号。










