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

有关CLR的初学小整理(可能理解不深刻,望大牛指出)的更多相关文章

  1. 有关CLR的初学小整理2(可能理解不深刻,望大牛指出)

    针对原文有用的段落,写一写自己的理解,注释: 1. 托管exe文件被启动的时候,首先被PE Loader载入.PE Loader载入exe文件之后,会分析PE文件头的data directory ta ...

  2. java 开发面试题小整理(一)

    本篇文档将持续更新,有基础滴,也有深层次的,谢谢! 1.看下面的程序是否有问题,如果有问题,请指出并说明理由. * byte b1 = 3; * byte b2 = 4; * byte b3 = b1 ...

  3. Python:通过一个小案例深入理解IO多路复用

    通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import time start = time.time() ...

  4. Swift初学有一点难理解的东西,整理了一下,想明白了。

      func makeIncrementer() -> (Int -> Int) {      func addOne(number: Int) -> Int {           ...

  5. 微信小程序demo理解

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Verdana } p.p2 { margin: 0.0px 0.0px 0.0px 0.0p ...

  6. StringBuffer的一些小整理

    大家好,欢迎大家在百忙当中来到我的博客文,也许是因为各种需要到此一游,哈哈.不过来到这里不会让您失望的,此段博文是这段时间不忙的时候整理出来的,对于刚学java基础的同学非常适合.下面言归正传: 首先 ...

  7. Haar小波的理解

    1. 首先理解L^2(R)的概念 L^2(R) 是一个内积空间的概念,表示两个无限长的向量做内积,张成的空间问题.也就是两个函数分别作为一个向量,这两个函数要是平方可积的.L^2(a,b)=<f ...

  8. kafka 第一次小整理(草稿篇)————演变[二]

    前言 简单整理一些kafka的设计. 正文 前文提及到log 的重要性,以及kafka在其中的作用,起着一个日志管理分发的作用,对于其他服务来说相当于新闻报社,订阅某种主题就会收到某类信息. 当人们意 ...

  9. kafka 第一次小整理(草稿篇)————分发的基本思路[三]

    前言 简单整理一下分发的基本思路. 正文 kafka 原本是做日志管理系统,主要是分发这块的. 那么如何做分发呢? 分发的是什么呢? 分发的其实是日志,日志是事件状态,kafka 内部就叫做Recor ...

随机推荐

  1. 【卡西欧Fx5800-p程序】01 坐标转换程序-带注释

    1.程序说明: DDSG  (大地坐标转施工坐标) SGDD  (施工坐标转大地坐标) ↙      (回车命令"EXE") K       (施工坐标转换原点在线性上的桩号,如果 ...

  2. PHP 中 Orientation 属性判断上传图片是否需要旋转(转)

    <?php $image = imagecreatefromstring(file_get_contents($_FILES['image_upload']['tmp_name'])); $ex ...

  3. 面向对象设计的SOLID原则

    S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ...

  4. 替换GitBlit的证书为域证书

    GitBlit(当前版本1.6.2,http://gitblit.org/) 是一个Git版本控制的服务端,使用java编写,功能上足够满足基本的版本控制要求,而且部署很简单方便,比如windows上 ...

  5. Silverlight:版本控制的衍化

    版本控制是企业开发中一个老生长谈的主题,这也是大部分公司新人进来后需要接纳的一个基础知识体系. 从08年首次接触商业软件编写后,这几年先后接触了SVN,TFS,Git这几个主要的版本控制器,但是并没有 ...

  6. Arduino 封装库

    这里是一个在Arduino平台下将常用的代码以库的形式封装的示例. 第一步:在Arduino的安装目录下的对应目录建立文件夹 C:\Program Files (x86)\Arduino\librar ...

  7. IOS开发 图形绘制,绘制线条,矩形,和垂直和居中绘制文字

    概述 吐槽下IOS下 的图形绘图,代码冗长,不得不自己重新封装方法.整理形成本文. 绘制线 // 绘制直线 + (void)toDrawLineFromX:(CGFloat)x1 Y:(CGFloat ...

  8. PHP vs Python

    最近在搞微信公众号方面的开发,发现很多开发微信公众号都使用PHP来开发,由于我之前开发Web端喜欢使用Python,所以从Quora网站找出一篇Which-is-better-PHP-or-Pytho ...

  9. Android working with Volley

    Volley是google官方推出的一个开源网络访问库,在项目中直接使用它,而不需要写一大堆的重复的代码; 项目主页: https://android.googlesource.com/platfor ...

  10. 2012年中国科学技术信息研究所发布自然科学SCI(E)论文期刊分区列表

    分区 期刊名称 ISSN 学科名称 学科名称(中文) 总被引频次 影响因子 5年影响因子 即年影响因子 被引半衰期 特征因子 论文影响指标 1区 ACM COMPUT SURV 0360-0300 C ...