更新:2007 年 11 月
.NET Framework 2.0 版本使承载公共语言运行库 (CLR) 的应用程序可以控制运行库的许多功能。可以用自定义实现替换某些功能(如内存分配和程序集加载)。可以控制其他功能的行为,在运行时接收事件通知并管理应用程序域。
初始化和启动承载的运行库
与早期版本的运行库一样,CorBindToRuntimeEx 函数会初始化运行库。可以选择要加载运行库的哪个版本,但是一个进程只能承载一种版本。如果加载了 2.0 版本,则该函数会返回用于启动运行库和执行托管代码的 ICLRRuntimeHost 接口。
![]() |
---|
在早期版本中,会返回 ICorRuntimeHost 接口。 |
将公共语言运行库加载到进程中中讨论如何启动运行库,转换为托管宿主代码中讨论如何执行托管代码。
宿主管理接口
在 .NET Framework 2.0 版本中,CLR 提供了用于控制所承载运行库的许多功能的宿主管理接口,允许宿主应用程序实现运行库提供的其他管理接口,并且使您可以实现自己的宿主管理接口。
出于发现目的,管理接口可分成两大类:
宿主实现的管理接口和运行库通过 IHostControl 接口发现的管理接口。
CLR 提供的管理接口和宿主通过 ICLRControl 接口发现的管理接口。
下表按它们所提供功能的种类对界面进行了分组。每组中最重要的接口排在最前面。
组 |
功能 |
接口 |
---|---|---|
程序集加载管理 |
允许宿主自定义从何处加载程序集、版本管理方式以及允许加载的程序集格式。例如,可以从数据库而不是硬盘中的文件加载程序集。 CLR 使用 IHostControl 接口发现宿主是否实现了这一组接口。 |
|
策略管理 |
允许宿主指定程序故障的处理方式,以便为不同的可靠性要求提供支持。 宿主使用 ICLRControl 接口访问运行库管理器,并为来自运行库的故障通知实现 IHostPolicyManager 回调。 |
|
宿主保护管理 |
允许宿主通过阻止使用指定的类型或成员来强制执行它自己的编程模型。例如,宿主可禁止使用线程或同步基元。 宿主使用 ICLRControl 接口访问运行库管理器。 |
|
内存管理 |
允许宿主通过针对 CLR 用来分配内存的操作系统功能提供替换功能,来控制内存分配。 CLR 使用 IHostControl 接口发现宿主是否实现了这一组接口。 |
|
垃圾回收管理 |
允许宿主实现用于接收垃圾回收开始和结束通知的方法。允许宿主初始化收集操作,以收集统计信息、指定收集操作的某些特征。 宿主使用 ICLRControl 接口访问运行库管理器。CLR 使用 IHostControl 接口发现宿主是否实现了这一组接口。 |
|
调试管理 |
允许宿主发现是否附加了某个调试器,以提供其他调试信息、自定义调试任务。 宿主使用 ICLRControl 接口访问运行库管理器。 |
|
CLR 事件管理 |
允许宿主注册由 EClrEvent 枚举的事件的通知。 宿主使用 ICLRControl 接口访问运行库管理器,使用 IActionOnCLREvent 接口实现其事件处理程序。 |
|
任务管理 |
当线程执行托管代码和非托管代码之间的转换时,可让宿主收到相应的通知。允许宿主控制线程关联、任务的启动和停止时间以及任务的安排。 CLR 使用 IHostControl 接口发现宿主是否实现了这一组接口。 |
|
线程池管理 |
允许宿主实现自已的线程池以供运行库使用。 CLR 使用 IHostControl 接口发现宿主是否实现了这一组接口。 |
|
同步管理 |
允许宿主实现自已的同步基元以供运行库使用。宿主可提供事件、临界区和信号量。 CLR 使用 IHostControl 接口发现宿主是否实现了这一组接口。 |
|
I/O 完成管理 |
允许宿主实现自已的异步输入/输出实现。 CLR 使用 IHostControl 接口发现宿主是否实现了这一组接口。 |
![]() |
---|
适用于 .NET Framework 1.0 和 1.1 的宿主接口中记录了早期版本的运行库的宿主接口。 |
应用程序域管理器
对于承载 CLR 的程序,应用程序域可提供更高的可靠性,因为它将程序集彼此隔离。通过卸载应用程序域,可以从进程中卸载程序集。
为了管理多个应用程序域,.NET Framework 2.0 版本将 AppDomainManager 类作为基类,您可从该类派生自己的应用程序域管理器。您为宿主应用程序设计的应用程序域管理器,本质上是宿主的扩展,采用托管代码。它会自动加载到您的进程中创建的每个应用程序域中。
应用程序域管理器可通过消除托管代码和非托管代码之间的某些转换操作提高性能。它可接收新应用程序域的创建通知,您可以利用该机会配置这些应用程序域。它还为非托管宿主提供了托管代码调用途径。