0

0

C#如何读取嵌入到程序集中的XML资源

畫卷琴夢

畫卷琴夢

发布时间:2026-01-24 09:03:08

|

435人浏览过

|

来源于php中文网

原创

在C#中获取嵌入式XML资源Stream需调用Assembly.GetManifestResourceStream()并确保资源名完全匹配默认命名空间、文件夹层级和扩展名,且生成操作设为Embedded Resource;加载时须用using确保流释放,避免资源泄漏。

c#如何读取嵌入到程序集中的xml资源

如何在C#中获取嵌入式XML资源的Stream

嵌入式XML资源必须通过 Assembly.GetManifestResourceStream() 获取原始流,不能直接用文件路径打开。关键在于资源名称必须完全匹配——包括默认命名空间、文件夹层级和扩展名。

  • 右键XML文件 → “属性” → 将“生成操作”设为 Embedded Resource
  • 资源名称默认格式为 [默认命名空间].[文件夹].[文件名],例如项目默认命名空间是 MyApp,XML放在 Data/config.xml,则完整名称是 MyApp.Data.config.xml
  • 可用 Assembly.GetManifestResourceNames() 列出所有嵌入资源名,调试时先打印出来确认拼写

用XDocument.Load()加载嵌入XML的正确方式

XDocument.Load() 接收 Stream,但不接受 null。如果 GetManifestResourceStream() 返回 null,说明资源名错误或资源未嵌入成功。

var assembly = Assembly.GetExecutingAssembly();
var stream = assembly.GetManifestResourceStream("MyApp.Data.settings.xml");
if (stream == null)
    throw new InvalidOperationException("Embedded XML resource not found.");

var doc = XDocument.Load(stream); // ✅ 正确:传入 Stream
// 注意:不要用 XDocument.Load("MyApp.Data.settings.xml") ❌ 这会尝试读文件系统

读取后立即关闭Stream的必要性

GetManifestResourceStream() 返回的 Stream 必须显式释放(或用 using),否则可能引发资源泄漏,尤其在高频调用场景下。

Mootion
Mootion

Mootion是一个革命性的3D动画创作平台,利用AI技术来简化和加速3D动画的制作过程。

下载
  • XDocument.Load(Stream) 不会自动关闭流,它只读取内容并保留流打开状态
  • 推荐用 using 包裹流,或用 Stream.CopyTo() 转成 MemoryStream 再加载(适合需多次读取的场景)
using var stream = assembly.GetManifestResourceStream("MyApp.Resources.data.xml");
var doc = XDocument.Load(stream); // stream 在 using 结束时自动释放

区分设计时资源路径与运行时资源名

VS里看到的文件路径(如 Resources\info.xml)≠ 运行时资源名。若项目属性中设置了“根命名空间”,它会前置到资源名;若XML文件属性中“自定义工具”设为 PublicResXFileCodeGenerator,那它就不是普通嵌入资源,而是生成了 Resources.Designer.cs —— 此时应走 Properties.Resources 访问,而非 GetManifestResourceStream

  • 纯嵌入XML:用 GetManifestResourceStream + 手动拼资源名
  • 已用ResX机制管理的XML:改用 Properties.Resources.ResourceManager.GetObject("info")(但返回的是 object,需转 byte[] 再构造 MemoryStream
  • 混淆点常出现在“XML文件被意外设为 ContentNone 生成操作”——此时 GetManifestResourceNames() 根本不会列出它
资源名大小写敏感,且编译后不可修改。最稳妥的做法是运行时先调用 GetManifestResourceNames() 输出全部名称,眼见为实。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

233

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

152

2023.12.20

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1897

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2088

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1042

2024.11.28

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

9

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

18

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 50.2万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号