.NET 配置体系实战:深入 Microsoft.Extensions.Configuration.Ini INI 配置提供程序
语言运行时标准库JIT编译编译器【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址https://gitcode.com/GitHub_Trending/runtime6/runtime点击查看免费下载导读本文聚焦 dotnet/runtime 仓库中Microsoft.Extensions.Configuration.Ini包它是 .NET 官方配置体系Microsoft.Extensions.Configuration的 INI 文件提供程序实现用于把 INI 文件如appsettings.ini解析为统一的IConfiguration键值配置模型。你将掌握AddIniFile/AddIniStream的完整用法、INI 语法解析规则注释、节、引号、嵌套节、错误处理行为以及optional/reloadOnChange等关键参数并从源码级理解其底层解析实现。包定位与仓库位置Microsoft.Extensions.Configuration.Ini是 .NET 官方配置提供程序家族的一员其实现代码位于仓库 src/libraries/Microsoft.Extensions.Configuration.Ini主要包含src/核心实现扩展方法、Source、Provider、流解析器ref/公共 API 参考Microsoft.Extensions.Configuration.Ini.cstests/完整的行为测试套件README.md本包使用文档从项目文件 Microsoft.Extensions.Configuration.Ini.csproj 可见它依赖Microsoft.Extensions.Configuration与Microsoft.Extensions.Configuration.FileExtensions两个项目因此天然继承了文件配置提供程序的通用能力文件监视、可选文件、IFileProvider抽象。同时它多目标编译支持netstandard2.0与 .NET Framework兼容面广。快速上手从 INI 文件构建配置根据 README.md 中的示例读取 INI 配置只需三步ConfigurationBuilder→AddIniFile→ 读取节与键值using System; using Microsoft.Extensions.Configuration; class Program { static void Main() { // Build a configuration object from INI file IConfiguration config new ConfigurationBuilder() .AddIniFile(appsettings.ini) .Build(); // Get a configuration section IConfigurationSection section config.GetSection(Settings); // Read configuration values Console.WriteLine($Server: {section[Server]}); Console.WriteLine($Database: {section[Database]}); } }配套的appsettings.ini内容[Settings] Serverexample.com DatabaseNorthwind在.csproj中把 INI 文件声明为复制到输出目录的内容项ItemGroup Content Includeappsettings.ini CopyToOutputDirectoryAlways/CopyToOutputDirectory /Content /ItemGroup需要说明这里的路径appsettings.ini是相对于ConfigurationBuilder的BasePath默认为当前工作目录解析的。若希望路径相对于程序集所在目录可在构建前调用SetBasePath(AppContext.BaseDirectory)。扩展方法全览AddIniFile 与 AddIniStream核心扩展方法定义在 IniConfigurationExtensions.cs共 6 个重载公共 API 见 ref 文件方法签名说明AddIniFile(this IConfigurationBuilder, string path)添加指定路径的 INI 文件文件必须存在不可选、不热重载AddIniFile(builder, string path, bool optional)控制文件是否可选AddIniFile(builder, string path, bool optional, bool reloadOnChange)额外控制文件变更时是否自动重载AddIniFile(builder, IFileProvider? provider, string path, bool optional, bool reloadOnChange)指定自定义IFileProvider访问文件AddIniFile(builder, ActionIniConfigurationSource? configureSource)通过委托完全自定义IniConfigurationSourceAddIniStream(builder, Stream stream)直接从一个Stream读取 INI 数据不经过文件系统各参数的默认行为从源码可以确认optional默认false文件不存在时Build()会抛出FileNotFoundException测试 IniConfigurationExtensionsTest.cs 中AddIniFile_ThrowsIfFileDoesNotExistAtPath验证了这一点设为true后文件缺失也不抛异常AddIniFile_DoesNotThrowsIfFileDoesNotExistAtPathAndOptional。reloadOnChange默认false设为true后FileConfigurationSource会注册文件监视器文件变化时自动触发配置重载。path为null或空字符串时抛出ArgumentException错误消息为资源文件中的Error_InvalidFilePathFile path must be a non-empty string.见 Strings.resx测试ThrowExceptionWhenPassingNullAsFilePath与ThrowExceptionWhenPassingEmptyStringAsFilePath均有覆盖。INI 语法解析规则源码级INI 文件的解析逻辑集中在 IniStreamConfigurationProvider.cs 的静态方法Read(Stream)中逐行处理规则如下1. 空白行与注释空白行直接跳过以;、#、/开头的行视为注释被忽略注意这三种注释符必须是该行第一个非空白字符。IniConfigurationProvider.cs 的 XML 文档中给出的完整示例[Section:Header] key1value1 key2 value2 ; comment # comment / comment测试SupportAndIgnoreComments验证了三种注释符均可被正确忽略。2. 节Section与嵌套节以[开头且以]结尾的行被识别为节头节名会去除首尾空白后追加ConfigurationPath.KeyDelimiter即冒号:作为后续键的前缀[Data:Inventory] ConnectionStringAnotherTestConnectionString等价于键Data:Inventory:ConnectionString。这意味着冒号同时承担节嵌套分隔符的职责。测试CanLoadValidIniFromStreamProvider与LoadKeyValuePairsFromValidIniFile均使用[Data:Inventory]与SubHeader:ProviderMySql验证了这种嵌套路径的展开。3. 键值对其余行必须以分隔键和值否则抛出FormatException消息来自Error_UnrecognizedLineFormatUnrecognized line format: {0}.。解析时键与值的首尾空白会被Trim()去除值如果被成对的双引号包裹value双引号会被剥除键不区分大小写因为结果字典使用StringComparer.OrdinalIgnoreCase。测试ShouldRemoveLeadingAndTrailingWhiteSpacesFromKeyAndValue\t key \t \t value\t→keyvalue与ShouldRemoveLeadingAndTrailingWhiteSpacesFromSectionName验证了空白处理LoadKeyValuePairsFromValidIniFileWithQuotedValues验证了引号剥除。关于引号有几个精确的边界行为见测试DoubleQuoteIsPartOfValueIfNotPaired与DoubleQuoteIsPartOfValueIfAppearInTheMiddleOfValue只有值首字符与末字符都是时才剥除双引号引号不成对如DefaultConnectionTestConnectionString时引号原样保留为值的一部分引号出现在值中间如TestConnectionString时同样原样保留。4. 重复键检测同一键含节前缀、忽略大小写出现两次时抛出FormatException消息来自Error_KeyIsDuplicatedA duplicate key {0} was found.。测试ThrowExceptionWhenKeyIsDuplicated验证了[Data:DefaultConnection]下的ConnectionString与[Data]下以冒号写的DefaultConnection:ConnectionString会被判定为同一键。5. 无节头文件不写节头、直接用冒号前缀书写完整键路径也是合法的测试LoadKeyValuePairsFromValidIniFileWithoutSectionHeader验证了这一点DefaultConnection:ConnectionStringTestConnectionString Data:Inventory:ProviderMySql解析器内部实现Read 方法剖析IniStreamConfigurationProvider.Read(Stream)是整个包的解析核心从源码看其流程如下IniStreamConfigurationProvider.cs用StringComparer.OrdinalIgnoreCase创建Dictionarystring, string?作为数据容器用StreamReader逐行读取sectionPrefix变量记录当前节前缀初始为空字符串每行先Trim()空白行continue首字符为;/#//的行continue若以[开头且以]结尾则把括号内的内容Trim()后拼接ConfigurationPath.KeyDelimiter更新sectionPrefix否则查找分隔符找不到就抛FormatException拼接key sectionPrefix 键部分.Trim()值部分Trim()再按规则处理成对双引号若data.ContainsKey(key)则抛重复键FormatException否则写入字典。IniConfigurationProvider与IniStreamConfigurationProvider都只是把Data IniStreamConfigurationProvider.Read(stream)或Data Read(stream)作为Load的实现见 IniConfigurationProvider.cs所以文件与流走的是同一套解析逻辑任何格式行为在两个入口上完全一致。IniConfigurationSource与IniStreamConfigurationSource分别是文件型与流型配置源的实现IniConfigurationSource.cs、IniStreamConfigurationSource.cs前者继承FileConfigurationSource因此获得IFileProvider、可选文件与热重载能力后者继承StreamConfigurationSource其Build方法直接返回对应的 Provider 实例。从 Stream 加载AddIniStream 的应用场景AddIniStream允许绕过文件系统直接从一个Stream构建配置非常适合配置内容来自网络、数据库、内存字符串或嵌入式资源的场景using var stream File.OpenRead(config.ini); var config new ConfigurationBuilder() .AddIniStream(stream) .Build();从实现看AddIniStream 内部注册的是IniStreamConfigurationSource。需要注意的差异流型配置源不支持热重载测试ReloadThrowsFromIniStreamProvider明确验证了对流构建的配置调用config.Reload()会抛出InvalidOperationException。此外测试CanLoadValidIniFromStreamProvider还验证了流来源的键同样不区分大小写config[defaultconnection:ConnectionString]可命中[DefaultConnection]节。错误行为汇总结合 Strings.resx 与测试所有异常行为可归纳如下场景异常类型消息path为 null 或空字符串ArgumentExceptionFile path must be a non-empty string.Error_InvalidFilePath文件不存在且optionalfalseFileNotFoundExceptionThe configuration file {path} was not found and is not optional. ...行内无分隔符FormatExceptionUnrecognized line format: {0}.Error_UnrecognizedLineFormat节头不完整如[ConnectionStringFormatException同上测试ThrowExceptionWhenFoundBrokenSectionHeader键重复忽略大小写FormatExceptionA duplicate key {0} was found.Error_KeyIsDuplicated对流配置调用Reload()InvalidOperationException—部署与分发方式根据 README.md 的 Deployment 章节Microsoft.Extensions.Configuration.Ini已包含在 ASP.NET Core 共享框架shared framework中因此 ASP.NET Core 应用无需显式安装即可使用同时该包也作为带外out-of-bandOOB包独立发布任何项目都可以直接通过 NuGet 引用Microsoft.Extensions.Configuration.Ini单独使用。测试验证与 API 稳定性本包携带三份测试文件是理解行为契约的最佳参考IniConfigurationTest.cs覆盖节/嵌套节、引号、注释、空白、重复键、坏行格式、缺失文件等全部解析行为IniConfigurationExtensionsTest.cs覆盖扩展方法的参数校验与可选文件行为ConfigurationProviderIniTest.csProvider 层面的加载测试。按照 README 的 Contribution Bar参见 src/libraries/README.md 中的约定该包 API 与功能已成熟但仍会不时扩展新特性属于接受新特性、新 API、缺陷修复与性能改进的组件。结语Microsoft.Extensions.Configuration.Ini用极少的代码核心解析器仅一个Read方法实现了对 INI 文件完整、健壮的解析支持注释、节、嵌套节、引号剥除、大小写不敏感键与重复键检测并通过继承FileConfigurationSource无缝获得可选文件与热重载能力。对于需要与 INI 格式兼容的存量配置或自定义配置源它是一个值得优先选用的官方实现其源码与测试也为理解 .NET 配置提供程序架构提供了一个简洁、完整的范本。赞分享语言运行时标准库JIT编译编译器【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址https://gitcode.com/GitHub_Trending/runtime6/runtime点击查看免费下载相关推荐.NET 中的 INI 配置提供程序用 Microsoft.Extensions.Configuration.Ini 读取 INI 文件.NET 中的 INI 配置提供程序用 Microsoft.Extensions.Configuration.Ini 读取 INI 文件 INI 是一种古老但语言运行时标准库JIT编译编译器.NET 配置系统实战Microsoft.Extensions.Configuration.Json JSON 配置提供程序完全指南.NET 配置系统实战Microsoft.Extensions.Configuration.Json JSON 配置提供程序完全指南 导读 本文基于 .NET语言运行时标准库JIT编译编译器.NET 运行时 User Secrets 配置提供程序Microsoft.Extensions.Configuration.UserSecrets原理与实战.NET 运行时 User Secrets 配置提供程序Microsoft.Extensions.Configuration.UserSecrets原理与实语言运行时标准库JIT编译编译器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

从零到一:30分钟学会GitHub建仓、提交与协作

从零到一:30分钟学会GitHub建仓、提交与协作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 15:59:14 阅读更多 →
AI直播限流怎么办?7款检测工具实测与优化方案

AI直播限流怎么办?7款检测工具实测与优化方案

做AI直播这行没有没被限流过的操盘手,区别只是有人被限了不知道原因,还在那儿一遍遍换话术重播。我在团队里负责直播间流量和内容合规这一块,从去年下半年开始批量跑AI无人直播和数字人带货,前后运营过二十多个账号。最夸张的一段…

2026/11/13 22:48:57 阅读更多 →
open-code-review实战:轻量自建开放代码审查流程指南

open-code-review实战:轻量自建开放代码审查流程指南

1. 为什么“open-code-review”值得单独拿出来聊第一次听到“open-code-review”这个词,很多人会下意识觉得它只是“代码审查”的又一个新包装。但真正在团队里推过代码审查的人都知道,这件事的难点从来不在“审”这个动作本身,而在于怎么让审…

2026/11/5 12:30:52 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/14 5:13:29 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/14 5:13:29 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/14 5:13:29 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/13 22:08:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/14 2:41:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/14 5:13:29 阅读更多 →

日新闻

周新闻

月新闻