C#读取内嵌资源文件 C#如何访问项目中的嵌入资源

来源:这里教程网 时间:2026-02-21 17:42:58 作者:

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

相关推荐

热文推荐