System.Collections.Immutable.dll 核心功能与缺失影响
System.Collections.Immutable.dll 是 .NET 基础类库(BCL)中承载“不可变集合”的程序集,最初以 NuGet 包 System.Collections.Immutable 的形式对外分发,自 .NET Core / .NET 5 起随运行时一并提供。它的存在,让开发者可以在并发与函数式编程场景下,用一套真正不可变的数据结构替代手工加锁。
一、核心功能
- 不可变集合类型族:提供 ImmutableArray<T>、ImmutableList<T>、ImmutableDictionary<TKey,TValue>、ImmutableHashSet<T>、ImmutableSortedSet<T>、ImmutableSortedDictionary、ImmutableStack<T>、ImmutableQueue<T> 等类型,覆盖数组、链表、哈希、排序以及队列栈结构。
- 持久化数据结构与结构共享:修改操作返回新实例,内部通过平衡二叉树(AVL / 红黑树)的节点共享复用未受影响的子树,把“整体复制”的开销降为对数级。
- 天然线程安全:实例一经创建即不可更改,读取无需加锁,可安全跨线程共享,从根本上消除迭代期间集合被修改所引发的异常。
- Builder 构建模式:通过 ToBuilder() 获得可变构建器,批量 Add / Remove 后再 ToImmutable() 一次性生成不可变实例,避免产生大量中间对象。
- 并发原子操作与扩展:ImmutableInterlocked 提供原子交换、原子更新等操作,并配有丰富的扩展方法与 LINQ 支持,便于与既有代码集成。
二、缺少该 DLL 的典型影响
- 启动即崩溃:程序集加载阶段抛出 FileNotFoundException 或 FileLoadException,提示“未能加载文件或程序集 System.Collections.Immutable”,应用往往在 Main 或首次调用相关 API 时直接终止。
- 隐性运行时错误:若仅复制了主程序而遗漏 bin 目录中的依赖,或 ClickOnce、插件目录、单文件发布场景未正确捆绑该程序集,可能直到运行具体方法时才抛出 MissingMethodException、MissingFieldException 或 TypeLoadException。
- 版本绑定失败:.NET Framework 项目常依赖 app.config 中的 bindingRedirect,若引用版本与运行时实际版本不一致又缺少重定向,会触发 FileLoadException。
- 连锁加载失败:多个上层库(如 ASP.NET Core、序列化与 ORM 组件)都间接依赖它,一处缺失会引发一连串依赖解析失败,难以快速定位根因。
- 规避方式:确保 NuGet 引用设置为复制到输出目录,部署时完整同步依赖树;或在 .NET Core / .NET 5+ 目标框架下由运行时统一提供。