你的位置:首页 > ASP.net教程

[ASP.net教程]有关CLR的初学小整理(可能理解不深刻,望大牛指出)


1.

.Net程序通过CLR去加载运行管理代码, 加载CLR的进程成为“宿主”,通常操作系统加载。 加载CLR的进程也可以为某个DLL,也成为“宿主”

2.

宿主接口使宿主能够对运行库的更多方面进行控制,从而能够在 CLR 和宿主的执行模型之间进行更紧密的集成。在.NET Framework 1 版中,宿主模型使非托管宿主能够将 CLR 加载到进程中、配置某些设置以及接收事件通知。但在通常情况下,宿主和 CLR 可以在该进程中独立运行

3.

所有的CLR Hosting API提供的主要功能包括:CLR的启动和关闭、App Domain相关、自定义错误处理、编程模型的执行、对调试器的支持、Assembly的Load相关、CLR的内部事件、CLR Engine相关、内存管理和垃圾回收、Threading、同步和I/O的支持等

4.

如果某一个特定的功能是由CLR来实现的,调用这个功能的相应的接口就用ICLR来开头,如果这个功能是Host实现的,就调用IHost开头的接口定义的函数

5.

此处所说的“接口”都是API,直接调用即可。类似调用Win32.API函数。

6.

MSCOREE.DLL负责选择.NET版本、调用和初始化CLR等工作。非托管程序想要启动CLR也必须引用MSCOREE.DLL,利用它的导出函数加载托管代码和进行定制CLR等操作

7.

MSCOREE.DLL宿主接口


宿主接口使宿主能够对运行库的更多方面进行控制,从而能够在 CLR 和宿主的执行模型之间进行更紧密的集成。在.NET Framework 1 版中,宿主模型使非托管宿主能够将 CLR 加载到进程中、配置某些设置以及接收事件通知。但在通常情况下,宿主和 CLR 可以在该进程中独立运行。通过 .NET Framework 2.0 版及更高版本中新的抽象层,宿主可以提供当前由 Win32 程序集中的类型提供的多种资源,并扩展了宿主可以配置的功能集。

MSCOREE.DLL同样提供了多个宿主接口,这里只介绍较为重要的几个,更多的内容请读者参考MSDN。

ICorRuntimeHost 接口

该接口是调用CLR要用到的第一个接口,它负责初始化工作。该接口由上面提到的CorBindToRuntimeEx函数返回.

EG:

ICLRRuntimeHost::Start 方法

将 CLR 初始化到进程中。

q  ICLRRuntimeHost::Stop 方法

使运行库停止代码的执行。

ICLRGCManager接口

该接口提供允许宿主与公共语言运行库的垃圾回收系统进行交互的方法

ICLRGCManager接口的各方法说明如下:

q  ICLRGCManager::Collect方法

为指定的生成强制执行垃圾回收。

q  ICLRGCManager::GetStats方法

获取有关垃圾回收系统的一组当前统计信息。

q  ICLRGCManager::SetGCStartupLimits方法

设置垃圾回收段的大小和垃圾回收系统零代的最大大小

 

8.

所有的CLR Hosting API提供的主要功能包括:CLR的启动和关闭、App Domain相关、自定义错误处理、编程模型的执行、对调试器的支持、Assembly的Load相关、CLR的内部事件、CLR Engine相关、内存管理和垃圾回收、Threading、同步和I/O的支持等

 

9.

加载CLR与执行代码实例

下面展示一下如何采用一个非托管的宿主来加载CLR并且执行里面的代码。请看代码清单1-11。

     代码清单1-11  加载CLR与执行代码实例

       //首先,在非托管宿主里面加载CLR并且启动

 ICLRRuntimeHost *pCLRHost = NULL;

 

      HRESULT hr = CorBindToRuntimeEx(

 

      L"v2.0.40103",          //需要加载的CLR版本,Null表示最新的

      L"wks",                  //GC的风格,Null表示默认的工作站模式

      STARTUP_CONCURRENT_GC,

 

      CLSID_CLRRuntimeHost,               //CLR的CLSID

 

      IID_ICLRRuntimeHost,             //ICLRRuntimeHost的IID

 

      (PVOID*) &pCLRHost);                 //返回的COM接口

 

      // 初始化并且启动CLR

 

       pCLRHost->Start();

 

 

//然后执行一段托管代码

hr = pCLRHost ->ExecuteInDefaultAppDomain(L"test.exe",

 

                                        L" test.Program",

 

                                        L"Start",

 

                                        NULL,

 

                                        &retVal);


代码清单1-11只是一个最简单的示例,在实际应用中可以实施更多的配置,由于篇幅所限,本书就不更多地去讲解相关内容了,可以明确的是,一切操作都不会脱离上述接口。

-----------------------注:本文部分内容改编自《.NET安全揭秘》

 

注:参考原文:

http://www.cnblogs.com/xuanhun/archive/2012/06/23/2559295.html