请描述在 .NET 中的多域应用程序里,程序集和类型是如何实现共享的?
考察说明
考察对 .NET 多域(AppDomain)架构中类型共享机制的理解,重点在于共享策略、前提条件和限制。
回答思路
- 【回答框架 1】在 .NET 中,AppDomain 是程序集的隔离容器,不同类型可以跨域共享的前提是程序集已被加载到域中。默认情况下,每个 AppDomain 有独立的加载上下文,程序集按需加载,类型不自动共享。
- 【回答框架 2】共享程序集有两种方式:一是将程序集加载到每个域中,此时类型是各自域内的独立副本;二是将程序集加载到共享的全局程序集缓存(GAC)或使用 LoaderOptimization 特性,实现跨域的类型共享,但需注意类型身份由程序集标识决定。
- 【回答框架 3】跨域共享的类型必须满足可序列化或继承自 MarshalByRefObject,以便 .NET 进行跨域调用(远程处理)。当类型是值类型或可序列化时,会通过复制传递;当继承自 MarshalByRefObject 时,通过代理引用传递。
- 【回答框架 4】实际应用中,共享应基于程序集标识和版本一致性:如果两个域加载同一程序集的不同版本,类型不兼容。此外,可通过静态字段共享数据,但需注意同步和生命周期管理,避免跨域锁竞争或内存泄漏。
- 【回答框架 5】现代 .NET Core/.NET 5+ 中,AppDomain 主要用于隔离和卸载,而跨域共享更多依赖程序集加载上下文和标准程序集加载机制,建议优先使用进程内共享或内存缓存来平衡性能和隔离。
- 【关键点 1】程序集按域加载,默认不共享类型,除非显式加载到多个域或使用 GAC。
- 【关键点 2】共享类型需可序列化或继承 MarshalByRefObject,以支持跨域复制或引用传递。
- 【关键点 3】跨域共享依赖程序集标识一致性,版本不一致会导致类型不兼容。
- 【关键点 4】静态数据可跨域共享,但需注意同步和生命周期管理。
- 【关键点 5】在多域场景中,共享应权衡隔离性和性能,必要时采用进程内共享或内存缓存。