如何在C#中获取嵌入资源的完整名称
嵌入资源的默认名称不是文件名,而是
默认命名空间.文件夹路径.文件名(全部用点分隔,且大小写敏感)。比如项目默认命名空间是
MyApp,资源放在
Resources/Config.json,则实际资源名称是
MyApp.Resources.Config.json。常见错误是直接用
Config.json去加载,结果返回
null。
调试时建议先列出所有嵌入资源名:
var names = Assembly.GetExecutingAssembly().GetManifestResourceNames(); foreach (var n in names) Console.WriteLine(n);
这样能一眼确认真实名称,避免拼错或漏掉命名空间前缀。
用GetManifestResourceStream
读取二进制资源
这是最常用、最稳妥的方式,适用于图片、JSON、XML、文本等所有类型。它返回
Stream,可配合
StreamReader、
JsonSerializer或
Image.FromStream等使用。 必须确保资源的“生成操作”属性设为
Embedded Resource(不是
Content或
None) 如果资源是文本,推荐用
StreamReader并显式指定编码(如
UTF8),否则可能乱码 流使用完需释放:用
using包裹,或手动调用
Dispose()
示例(读取JSON字符串):
using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyApp.Resources.Config.json");
using var reader = new StreamReader(stream, Encoding.UTF8);
string json = reader.ReadToEnd();
为什么Properties.Resources
不适用于任意文件
Properties.Resources只支持设计器明确添加的资源(如图标、字符串、音频),且会自动转换格式(如PNG转
Bitmap,文本转
string)。它无法访问你手动添加的
.json、
.xml或自定义二进制文件——这些不会出现在
Resources.Designer.cs里。
如果你看到
Properties.Resources.MyConfig编译报错,说明该资源没被设计器识别,此时必须改用
GetManifestResourceStream。
常见错误:NullReferenceException
或空内容
绝大多数问题出在资源名不匹配或资源未嵌入。检查以下几点:
资源文件的“生成操作”是否真的是Embedded Resource(右键文件 → 属性 → 生成操作) 资源名是否包含正确大小写的默认命名空间(可在项目属性 → 应用程序 → 默认命名空间查看) 是否误用了
GetExecutingAssembly()——若资源在类库中,而调用代码在主程序集,需用
typeof(MyClass).Assembly获取对应程序集 文本资源未指定编码,导致
StreamReader用系统默认编码读取,中文变乱码
资源加载失败不会抛异常,而是返回
null,所以务必判空再读取流。
真正麻烦的不是语法,而是命名空间和生成操作这两个地方——改错一个,整个路径就失效。建议第一次加资源时,先跑一遍
GetManifestResourceNames()确认名字,比反复试错快得多。
