什么是CLR寄宿与AppDomain在.NET中的应用?

摘要:CLR #appdomain #plugin 第22章:CLR寄宿与AppDomain 《CLR Via C#》第22章聚焦CLR寄宿和AppDomain,这是.NET框架中管理托管代码执行与隔离的核心机制 一、核心概念:CLR寄宿与App
CLR #appdomain #plugin 第22章:CLR寄宿与AppDomain 《CLR Via C#》第22章聚焦CLR寄宿和AppDomain,这是.NET框架中管理托管代码执行与隔离的核心机制 一、核心概念:CLR寄宿与AppDomain 1. CLR寄宿 CLR寄宿是指将.NET运行时(CLR)嵌入到宿主进程(如ASP.NET、SQL Server或自定义应用)中运行。宿主控制CLR的加载、初始化和行为,提供托管代码的执行环境。 核心职责: 加载CLR(通过CorBindToRuntimeEx等API)。 配置CLR(指定版本、垃圾回收模式等)。 管理资源分配与运行时生命周期。 实用场景: ASP.NET:动态处理Web请求。 SQL Server:执行托管存储过程。 自定义宿主:运行特定.NET代码。 2. AppDomain AppDomain是CLR中的轻量级隔离单元,运行在同一进程内,提供代码隔离、动态加载和卸载功能。相比进程,AppDomain开销更低,适合需要隔离但共享进程资源的场景。 核心特性: 隔离性:每个AppDomain有独立内存、类型系统和对象实例。 动态性:支持运行时加载/卸载程序集。 安全性:通过权限集限制代码行为。 通信:跨AppDomain通过代理或序列化实现。 实用场景: 插件系统:动态加载/卸载插件。 多租户架构:隔离不同用户代码。 测试环境:运行隔离的测试用例。 Mermaid图:CLR寄宿与AppDomain关系 以下图表展示了宿主进程、CLR和AppDomain的层次结构: graph TD A[宿主进程] -->|加载| B[CLR] B -->|创建| C[默认AppDomain] B -->|创建| D[自定义AppDomain 1] B -->|创建| E[自定义AppDomain 2] C -->|运行| F[程序集A] D -->|运行| G[程序集B] E -->|运行| H[程序集C] D -->|跨域通信| E 二、深入剖析:核心机制与代码示例 1. CLR寄宿的实现 宿主通过ICorRuntimeHost或ICLRRuntimeHost接口加载CLR,并可配置运行时参数。以下是一个简化的自定义宿主示例: using System; using System.Runtime.InteropServices; class Program { [DllImport("mscoree.dll", CharSet = CharSet.Unicode)] static extern int CorBindToRuntimeEx( string pwszVersion, string pwszBuildFlavor, uint startupFlags, ref Guid rclsid, ref Guid riid, out IntPtr ppv); static void Main() { Guid clsid = new Guid("CB2F6723-AB3A-11D2-9C40-00C04FA30A3E"); // CLSID_CorRuntimeHost Guid riid = new Guid("CB2F6722-AB3A-11D2-9C40-00C04FA30A3E"); // IID_ICorRuntimeHost IntPtr ppv; int hr = CorBindToRuntimeEx("v4.0.30319", "wks", 0, ref clsid, ref riid, out ppv); if (hr >= 0) { Console.WriteLine("CLR loaded successfully!"); // 进一步初始化和运行代码 } } } 关键点: 指定CLR版本(如v4.0.30319)和工作站模式(wks)。 使用COM接口与CLR交互。 宿主可控制垃圾回收、线程模型等。 2. AppDomain的创建与管理 AppDomain的创建和使用是本章的重点。
阅读全文