C# 嵌入资源加载 + 外部配置文件的兜底配置

**嵌入资源:**嵌入资源无法在程序发布后随意修改(它被打包到程序集内部,而非独立文件),这看似是 "缺点",但也正是它的核心价值所在。嵌入资源有其明确的适用场景,主要用于存放无需动态修改、需要随程序集一起分发、希望被保护或避免丢失的文件。

文章主题:嵌入资源 + 外部配置文件 结合使用

在实际开发中,我们通常不会 "非此即彼",而是采用 **"嵌入资源兜底 + 外部配置文件覆盖"** 的组合方案,兼顾两者的优点:

  1. 嵌入默认资源:将核心配置 / 模板作为嵌入资源,作为程序的 "兜底配置"(确保程序在无外部配置时也能正常运行);
  2. 外部配置文件动态覆盖:允许用户在程序同级目录放置同名配置文件,程序运行时优先读取外部配置文件;若外部配置不存在,则读取嵌入资源的默认配置。

这种方案既解决了 "外部配置灵活修改" 的需求,又避免了 "外部配置缺失导致程序崩溃" 的问题

具体做法实例:

1. 添加资源文件

在项目中右键 → 新建 → 文本文件 → 重命名为 config.json,写入测试内容:

复制代码
{
  "AppName": "嵌入资源演示程序",
  "Version": "1.0.0",
  "Author": "TestUser",
  "Settings": {
    "IsDebug": true,
    "Timeout": 3000
  }
}

2. 设置文件为「嵌入资源」

这是关键步骤 (若不设置,无法通过 GetManifestResourceStream 获取资源):

  1. 在 Visual Studio 中,选中 config.json 文件
  2. 右键 → 属性(Properties)
  3. 在「高级」(Advanced)选项中,找到「生成操作」
  4. 将其值改为「嵌入的资源」
  5. 保存设置(其他默认即可)

3.本地程序执行debug文件夹内新建config.json文件,配置内容如下:

4.实现代码:

cs 复制代码
       Console.WriteLine("读取config配置");      
       LoadEmbeddedResource("config.json");
       Console.WriteLine("读取完成");



        /// <summary>
        /// 通用方法:加载当前类所在命名空间下的嵌入资源
        /// </summary>
        /// <param name="resourceName">资源文件名(如 "config.json")</param>
        /// <returns>资源流</returns>
        public string LoadEmbeddedResource(string resourceName)
        {
            string fileContent;

           // 1. 优先读取外部同级目录的config.json
            string exeDirectory = AppDomain.CurrentDomain.BaseDirectory;
            string fullFilePath = Path.Combine(exeDirectory, resourceName);

            // 验证文件是否存在
            if (File.Exists(fullFilePath))
            {
                using (var stream = new FileStream(fullFilePath, FileMode.Open, FileAccess.Read))
                using (var reader = new StreamReader(stream, System.Text.Encoding.UTF8))
                {

                    fileContent = reader.ReadToEnd();
                    textBox1.Text += fileContent;
                    Debug.WriteLine("===== 读取到本地资源(config.json)内容 =====");
                    Debug.WriteLine(fileContent);
                }

                return fileContent;
            }

            // 2. 外部配置不存在时,读取嵌入资源的默认配置(兜底)
            string fullResourceName = $"{GetType().Namespace}.{resourceName}";
            using (var stream = GetType().Assembly.GetManifestResourceStream(fullResourceName))
            // 使用 StreamReader 读取流内容
            using (var reader = new StreamReader(stream))
            {
                fileContent = reader.ReadToEnd();
                textBox1.Text += fileContent;
                Debug.WriteLine("===== 读取到嵌入资源(config.json)内容 =====");
                Debug.WriteLine(fileContent);
            }

            return fileContent;

        }
 
相关推荐
wuqingshun314159几秒前
重写equals而不重写hashCode,会出什么问题?
java·开发语言
飞猪~2 分钟前
LangChain python 版本 第一集
开发语言·python·langchain
李燚2 小时前
Go 项目怎么组织:DDD 4 层 vs MVC vs 脚本式
开发语言·golang·mvc·ddd·agent框架·eino
2zcode2 小时前
免费开源项目文档:基于MATLAB图像处理的啤酒瓶口缺陷检测系统设计与实现
开发语言·图像处理·matlab
人工智能时代 准备好了吗3 小时前
AI回答内容进入率监测:引用识别、文本匹配与语义判断
开发语言·人工智能·python
LONGZETECH3 小时前
新能源汽车动力电池检测仿真教学系统:C/S 分层架构与数字化实训落地全解析
大数据·c语言·开发语言·人工智能·架构·系统架构·汽车
郝学胜-神的一滴3 小时前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
Metaphor6923 小时前
使用 Python 冻结 Excel 文件中的行、列和单元格
开发语言·python·excel
言乐64 小时前
Python实现建造微服务商城后台
开发语言·python·算法·微服务·架构
KobeSacre4 小时前
Semaphore 源码
java·开发语言