一看这个标题,是不去取名有点绕呢?或者是,还有些问题?报告LZ...你的标题取得有问题,是个病句!↖(^ω^)↗!!!先不要急,其实我今天带给大家的就是CoreCLR中的coreclr。其中它是在名字叫HOST的一个子目录里面的。我的理解是HOST=宿主,GC因为是寄宿在WINDOWS中的,那么它是依靠什么寄宿呢,core-Console是我们狭义上的控制台吗?我觉得不是,我们可以把这个控制台理解为CoreCLR宿主的一个控制台,它控制了各个模块的调度,这全是我个人的理解。

  这篇文章我也是采取随机抽取代码的方式来进行讲解,因为我自己也是变学边讲,我并不比大家懂得多多少,希望大家多能砸砸我的场子。大家可以看看,首先此文件引用了windows.h,那么它肯定是和我们的操作系统打交道的一个入口了。

  我们来看看第一行代码,这其实可以表明几个知识点,第一,coreclr是基于“类”的,它不会轻易的实例化;第二点,coreclr是在runtime的时候改变其状态的;第三:Coreclr其实本身是让DLL转换成32位字符型的指针变量存储在内存中。

  1. // The name of the CoreCLR native runtime DLL.
  2. static const wchar_t *coreCLRDll = W("CoreCLR.dll");

 那么我们再来找一个这个W("xxx")是什么,下面我的已经做了解释

  1. // This macro is used to standardize the wide character string literals between UNIX and Windows.
  2. // Unix L"" is UTF32, and on windows it's UTF16. Because of built-in assumptions on the size
  3. // of string literals, it's important to match behaviour between Unix and Windows. Unix will be defined
  4. // as u"" (char16_t)
  5.  
  6. //定义的作用是标准化“宽字符”在Unix内核系统和Windows内核心态之间。
  7. //Unix系统中,L""是UTF32,windows是UTF16.因为编译时就把它们定义成了不同的大小。
  8. //Unix中,u""会被定义成char16_t类型
  9. #ifdef PLATFORM_UNIX
  10. #define W(str) u##str
  11. #else // PLATFORM_UNIX
  12. #define W(str) L##str
  13. #endif // PLATFORM_UNIX

  StringBuffer是HostEnvironment的一个成员,来看看下面的代码,所以我认为,这里的StringBuffer,其实是和程序集有关系的,虽然我不知道有什么关系。

  1. // The list of paths to the assemblies that will be trusted by CoreCLR
  2. //程序集路径的集合将会被CoreCLR所信任
  3. StringBuffer m_tpaList;

  下面我们还是先来看看这个StringBuilder吧。

  1. // Dynamically expanding string buffer to hold TPA list
  2. //动态扩展字符串缓冲区适应TPA动态列表
  3. class StringBuffer {
  4. static const int m_defaultSize = 4096; //默认大小:4096个字节;4KB;1KB=1024字节
  5. wchar_t* m_buffer; //最小缓冲区
  6. size_t m_capacity; //最小区容量
  7. size_t m_length; //最小字节长度
  8.  
  9. StringBuffer(const StringBuffer&); //带一个StringBuffer指针变量的构造函数
  10. StringBuffer& operator =(const StringBuffer&); //定义一个重载操作符符,返回StringBuffer
  11.  
  12. public:
  13. //无参构造函数,并初始化部分成员变量
  14. StringBuffer() : m_capacity(0), m_buffer(nullptr), m_length(0) {
  15. }
  16.  
  17. //析构函数,释放缓冲区,注意析构函数是在程序结束时调用
  18. ~StringBuffer() {
  19. delete[] m_buffer;
  20. }
  21.  
  22. //返回已知缓冲区的指针变量的第一个节点的地址
  23. const wchar_t* CStr() const {
  24. return m_buffer;
  25. }
  26.  
  27. //是不是有点像.NET中StringBuilder里面的Append呢?
  28. void Append(const wchar_t* str, size_t strLen) {
  29.  
  30. //如果m_buffer指向“空”
  31. if (!m_buffer) {
  32. //新建一个默认大小的数组,并分配给已知缓冲区
  33. //这里之所以用数组,是因为空间可以理解为连续的空间。
  34. m_buffer = new wchar_t[m_defaultSize];
  35. //初始化缓冲区容量
  36. m_capacity = m_defaultSize;
  37. }
  38. //如果最小长度+现有长度+单位长度比最小容积要大
  39. if (m_length + strLen + 1 > m_capacity) {
  40.  
  41. //2倍扩容
  42. size_t newCapacity = m_capacity * 2;
  43. wchar_t* newBuffer = new wchar_t[newCapacity];
  44. //这个函数我么见过,不过从字面上理解,应该是把以前的一些容量在内存中替换成新的容量
  45. //PS(wcsncpy_s):Copy a wide - character string, to a maximum length
  46. //wcsncpy_s拷贝宽字符串,得到一个最大长度。
  47. wcsncpy_s(newBuffer, newCapacity, m_buffer, m_length);
  48.  
  49. //重新赋值
  50. delete[] m_buffer;
  51. m_buffer = newBuffer;
  52. m_capacity = newCapacity;
  53. }
  54. //否则不扩容拷贝
  55. wcsncpy_s(m_buffer + m_length, m_capacity - m_length, str, strLen);
  56. //每次执行以后,最小长度都会加上已经拷贝的长度
  57. m_length += strLen;
  58. }
  59. };

  有句话说得好,如果单单看一个问题,我们很难有深刻的记忆,所以当我讲解StringBuffer的时候,我打算“创新”一把,我会根据代码的上下文的应用来进行讲解。在192行左右有如下代码:

  1. if (!m_tpaList.CStr()) return false;

  还有跟大家说一下为什么很多的变量都要定义成const的,因为这些东西只有在“运行时”的时候才可以改变。

  1. //返回已知缓冲区的指针变量的第一个节点的地址
  2. const wchar_t* CStr() const {
  3. return m_buffer;
  4. }  

  那么Append是怎么用的呢?是不是很像某个方法?(*^__^*) 嘻嘻……

  1. m_tpaList.Append(assemblyPath, assemblyPathLength);
  2. m_tpaList.Append(W(";"), 1);

  上面提到了TPA,我个人觉得应该是一些类似程序集生成的Dll文件的一个list集合,反正我也没查到,从网上,索性先这么理解吧。下面我们再来看一个东西:HostEnvironment,下面是部分成员变量:

  1. // The path to this module
  2. //模块的路径
  3. wchar_t m_hostPath[MAX_LONGPATH];
  4.  
  5. // The path to the directory containing this module
  6. //模块对应的物理目录的地址
  7. wchar_t m_hostDirectoryPath[MAX_LONGPATH];
  8.  
  9. // The name of this module, without the path
  10. //模块对应的名字
  11. wchar_t *m_hostExeName;
  12.  
  13. // The list of paths to the assemblies that will be trusted by CoreCLR
  14. //程序集路径的集合将会被CoreCLR所信任
  15. StringBuffer m_tpaList;

  这里面有一个很特别的成员,它是一个接口,是不是很神奇呢?C++也有接口。

  1. ICLRRuntimeHost2* m_CLRRuntimeHost;

  下面是定义:

  1. typedef interface ICLRRuntimeHost2 ICLRRuntimeHost2;

  大家也许对这个接口有一点小的疑问,为什么会有个2?有2,是不是有1呢?看下图,果然验证了我们的猜测。

  下面我们来看看余下的2个成员变量:

  1. //HMODULE 是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址 --来自度娘
  2. HMODULE m_coreCLRModule;
  3.  
  4. //CoreCLR自带的日志系统
  5. Logger *m_log;

  今天时间不早了,我也准备睡觉了,以后有空会继续和大家分享的哦。

C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(1)的更多相关文章

  1. C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(2)

    这篇文章是上篇的续集,本文将会继续介绍coreconsole.cpp里面的逻辑.也许大家会看一些CLR的书,我承认我没有看过,因为我觉得一个人,他再NB,那也是他自己的眼光,而且说句难听的,CLR也不 ...

  2. 【置顶】CoreCLR系列随笔

    CoreCLR配置系列 在Windows上编译和调试CoreCLR GC探索系列 C++随笔:.NET CoreCLR之GC探索(1) C++随笔:.NET CoreCLR之GC探索(2) C++随笔 ...

  3. 一系列令人敬畏的.NET核心库,工具,框架和软件

    内容 一般 框架,库和工具 API 应用框架 应用模板 身份验证和授权 Blockchain 博特 构建自动化 捆绑和缩小 高速缓存 CMS 代码分析和指标 压缩 编译器,管道工和语言 加密 数据库 ...

  4. vNext之旅(1):从概念和基础开始

    ASP.NET vNext or .NET vNext? vNext在曝光以来绝大多数以ASP.NET vNext这样的的字眼出现,为什么这边会提及.NET vNext?原因是我认为ASP.NET只是 ...

  5. ASP.NET vNext or .NET vNext?

    ASP.NET vNext or .NET vNext? 从概念和基础开始 vNext在曝光以来绝大多数以ASP.NET vNext这样的的字眼出现,为什么这边会提及.NET vNext?原因是我认为 ...

  6. SQL-三级分类查询

    /*SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.5.40 : Database - appinfodb******************************** ...

  7. mybatis第一天——入门与概述

    大纲摘要: 1.mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 a) 原始da ...

  8. 基于SqlSugar的开发框架循序渐进介绍(3)-- 实现代码生成工具Database2Sharp的整合开发

    我喜欢在一个项目开发模式成熟的时候,使用代码生成工具Database2Sharp来配套相关的代码生成,对于我介绍的基于SqlSugar的开发框架,从整体架构确定下来后,我就着手为它们量身定做相关的代码 ...

  9. C++随笔:.NET CoreCLR之GC探索(4)

    今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...

随机推荐

  1. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  2. .NET 4.6.2正式发布带来众多特性

    虽然大多数人的注意力都集中在.NET Core上,但与原来的.NET Framework相关的工作还在继续..NET Framework 4.6.2正式版已于近日发布,其重点是安全和WinForms/ ...

  3. 漫扯:从polling到Websocket

    Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(73)-微信公众平台开发-消息管理

    系列目录 前言 回顾上一节,我们熟悉的了解了消息的请求和响应,这一节我们来建立数据库的表,表的设计蛮复杂 你也可以按自己所分析的情形结构来建表 必须非常熟悉表的结果才能运用这张表,这表表的情形涵盖比较 ...

  5. 问题记录:EntityFramework 一对一关系映射

    EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...

  6. JavaScript实现DOM对象选择器

    目的: 根据传入的选择器类型选出第一个符合的DOM对象. ①可以通过id获取DOM对象,例如 $("#adom"); ②可以通过tagName获取DOM对象,例如 $(" ...

  7. Log4net - 项目使用的一个简单Demo

    参考页面: http://www.yuanjiaocheng.net/entity/entitytypes.html http://www.yuanjiaocheng.net/entity/entit ...

  8. 在你的ASP.NET MVC中使用查找功能

    在程序中,使用查找功能是少之不了.今天在ASP.NET环境下演示一回. 在cshtml视图中,有三个文本框,让用户输入关键词,然后点击最右连的“搜索”铵钮,如果有结果将显示于下面. Html: 表格放 ...

  9. Highcharts中国地图热力图

    最近有个项目需要将MC销量按大陆各省统计,并以中国地图人力图效果显示.由于项目一直使用Highcharts进行图表的统计,故采用Highmaps来实现. 效果如下: 1)中国各个省.直辖市.自治区: ...

  10. 【每日一linux命令2】命令执行顺序:

    二.命令顺序:     若在 shell 内置的命令/bin 以及/usr/bin 之下都出现了命令 pwd,那当我们执行该命令时,会执行哪 一个?答案是第一优先执行 shell 内置的命令,再执行路 ...