在c#中获取嵌入资源的完整名称需遵循“默认命名空间.文件夹路径.文件名”格式(大小写敏感),如myapp.resources.config.json;应先用getmanifestresourcenames()列出所有资源名验证,再通过getmanifestresourcestream配合streamreader等读取,并确保生成操作设为embedded resource。

如何在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()确认名字,比反复试错快得多。










