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. js中“==”与"==="的区别

    首先,== equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 一言以蔽之:==先转换类型再 ...

  2. Mac 安装终端软件

    1.安装或者重新安装lua环境 下载 lua 地址: http://www.lua.org/versions.html 1.进入 lua 目录 2.make macosx 3.sudo make in ...

  3. The model backing the <Database> context has changed since the database was created.

    Just found out the answer and thought of updating here. Just need to do the following. public class ...

  4. 《objective-c基础教程》学习笔记(十)—— 内存管理

    本篇博文,将给大家介绍下再Objective-C中如何使用内存管理.一个程序运行的时候,如果不及时的释放没有用的空间内存.那么,程序会越来越臃肿,内存占用量会不断升高.我们在使用的时候,就会感觉很卡, ...

  5. adb使用

    一.使用adb删除系统应用,如Launcher.apk adb root                 获取root权限 adb remount          挂载系统的读写权限 adb she ...

  6. AX2012 R3升级CU8的一些错误

    AX2012 R3安装升级包CU8后进入系统,系统会提示打开软件升级清单“Software update checklist”,清单列出了升级要做的一系列动作. 在进行到编译应用时“Compile a ...

  7. Kruskal算法java版

    /** * sample Kruskal.java Description: * kruskal算法的思想是找最小边,且每次找到的边不会和以找出来的边形成环路,利用一个一维数组group存放当前顶点所 ...

  8. Android复制assets目录下的图片到内存

    转自:http://www.chenwg.com/android/android%E5%A4%8D%E5%88%B6assets%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84 ...

  9. Cocos2d-JS项目之二:studio基础控件的使用

    在studio里把几个基础控件往场景文件一拖,然后导出json格式的资源文件 逻辑代码如下: var HelloWorldLayer = cc.Layer.extend({ sprite:null, ...

  10. 从抽象谈起(三):AOP编程和ASP.NET MVC

    AOP(Aspect oriented programming)面向切面编程.说成切面不容易理解,代码哪里有切面?又不是三维物体.概念不管,我们从其思想来理解这个名词吧. AOP的主要思想是把相同.相 ...