图解DotNet框架之一:编译与执行引擎(上)

众所周知,DotNet框架是非常庞大的,光项目创建时的种类就有WPF,WCF,WF这三种最新的技术,还有以前的Web,WinForm,Service,Mobile等等.
这么复杂和庞大的框架,用文字来描述是远远不够的,所以我准备写一系列图文并茂的文章,把我所知道的所有Net框架中的东西全部串联起来,希望可以给大家一个DotNet框架的知识图,本人能力有限,难免有理解错误和表达不清的地方,望大家谅解并指教.        
      好,我们现在就开始第一张图的学习,再所有的文章写完后,大家将会得到一个完整的框架图。

    

 

下面我会做出对这个图的解释,请大家对照图来一步一步的学习。

1.CTS  和 CLS :

    CTS:公共类型系统。他是一个集合{类,接口,委托,结构,枚举,类型成员,基本数据类型},只有符合CTS的类型才能在CLR上运行。 简单点说就是VB,C#,C++等DotNet支持的语言的类型集合。这些东西大部分都定义在System.dll中,我们将在下一篇来讨论 system.dll。
    CLS:公共语言规范。从图上可以看出,他是CTS的子集,为什么他是子集呢?因为在C#中有Ulong而VB中就没有。看以下代码

    public class Test
    
{
        
public ulong Add(ulong a, ulong b)  //如果某语言特有的类型,作为返回类型和参数则不遵循CLS
        {
            
return a + b;
        }

        
public int Add(int a, int b)   //但是作为局部变量则仍然遵循CLS
        {
            
ulong x;
            
return a + b;
        }
 
    }


    在默认.NET开发平台上是不会执行CLS检查的,如果要开启可以在AssemblyInfo.cs中加入代码

[assembly:System.CLSCompliant(true)]


大家可能要问,为什么要遵循CLS呢?答案在后面给出。

2. CIL,元数据和程序集清单

     CIL:公共中间语言。我们大家都知道,在.Net中使用VB写一个DLL,那么在C#的项目中也可以调用,反之亦然。如何实现的呢?就 是CIL了,前面我们说过CLS的作用,并且留下了为什么要遵守CLS的疑问,就是因为.net编译生成的dll或Exe,其实主要是CIL,原数据和程 序集清单这三部分组成。那么要想VB和C#共享,就要有一个通用的规范,它就是CLS了,呵呵,现在明白为什么要CLS了吧,如果你不去遵守CLS也是可 以的,但是就不能保证你的dll的复用性了。
    元数据:.net的反射,远程处理,序列化这些东西都很神秘吧,其实他们都是原数据的功劳,你所定义的类,方法,方法的返回类型和参数,属性,字段,都会被编译成元数据,然后当你序列化或反射时,拿这些原数据给你生成一个类。
    程序集清单:这个就容易理解了,你添加的dll引用的信息全都在这里。下面是一个Dll中的信息。

    原代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
        }

    }

    
public class Test
    
{
        
public ulong Add(ulong a, ulong b)  //如果某语言特有的类型,作为返回类型和参数则不遵循CLS
        {
            
return a + b;
        }

        
public int Add(int a, int b)   //但是作为局部变量则仍然遵循CLS
        {
            
ulong x;
            
return a + b;
        }

    }

}

    使用.Net自带的 ILDisassembler.exe 察看的IL: 

.class public auto ansi beforefieldinit ConsoleApplication3.Test
       extends [mscorlib]System.Object
{
 .method 
public hidebysig instance int32 
          Add(int32 a,
              int32 b) cil managed
  
{
    
// Code size       4 (0x4)
    .maxstack  8
    IL_0000:  ldarg.
1
    IL_0001:  ldarg.
2
    IL_0002:  add
    IL_0003:  ret
  }
 // end of method Test::Add
}


    就是这三样东西组成的dll,让.net实现了远程处理的remoting,反射,序列化和跨平台,跨语言。关于跨平台的问题,我们在下一篇讨论。。

转载于:https://www.cnblogs.com/hanmos/archive/2011/10/17/2215716.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kissy WaterFall】实行手动加载数据

前言:由于Kissy WaterFall默认是监听滚动事件来实现数据动态加载的,但是有一些情况要用到手动加载数据。以下是使用Kissy WaterFall实现手动加载数据的方法。 最终实现效果:点击”逛更多的商店“会动态加载数据 步骤: 当一页数据加…

web服务器文档根目录在哪里,web服务器根目录在哪

web服务器根目录在哪 内容精选换一换SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(访问方式为HTTPS),实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露。SSL保证了双方传递信息的安全性,而且用户可以通过…

console java_Java Console writer()方法与示例

console java控制台类writer()方法 (Console Class writer() method) writer() method is available in java.io package. writer()方法在java.io包中可用。 writer() method is used to get a distinct PrintWriter object linked with this Console. writer()方法用于获取与此…

二、图片加载与保存

一、基本概念 1,什么是图片? 答:图像是结构化存储的数据信息 2,图像的属性 答:1、通道数目,2、宽与高,3、像素数据,4、图像类型 二、加载显示图像并保存 import cv2 import nump…

LeetCode 206. 反转链表 思考分析

题目 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 迭代双指针 从某公众号(代码随想录)搬过来的gif图&…

hdu 2846 Repository 字典树的变形

Repository Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)                  Total Submission(s): 1129 Accepted Submission(s): 382 Problem DescriptionWhen you go shopping, you can search in repository…

怎样看虚拟主机的服务器,虚拟主机怎么查看服务器类型

虚拟主机怎么查看服务器类型 内容精选换一换使用华为云提供的公共镜像制作私有镜像时,您需先购买云主机等云资源时镜像选择公共镜像、云服务器类型建议统一选择“s3 (通用计算型)”,在云主机安装部署完商品,然后参照以下方式进行私有镜像制作…

Win32动态库 Lib文件哪去了

最近使用SQLite,用源文件.c和.h编译SQLite的动态库,编译后发现没有Lib文件。 原来:SQLite的.c文件没有引用.h文件,添加引用,编译,Lib文件有了。转载于:https://www.cnblogs.com/yunuoyuhan/p/3204457.html

console java_Java Console format()方法与示例

console java控制台类format()方法 (Console Class format() method) format() method is available in java.io package. format()方法在java.io包中可用。 format() method is used to write the formatted string to this Console with the help of the given string format…

Anaconda自带Python编译器Jupyter Notebook显示代码行数

ESC:进入命令行模式;按下H即可显示各种快捷键信息 Enter:进入编辑模式 方法一:命令方法 一、点击代码段,按ESC,使代码段显示蓝色,进入命令行模式 二、按下ShiftL,显示代码行数 方法…

ajax 服务器响应,ajax-服务器响应

如果需要获得了来自服务器的响应,则使用XMLHttpRequest 对象的 responseText 或 responseXML 属性responseText:获得字符串形式的响应数据,当readyState属性值变为4时,responseText属性才可用,表明Ajax请求已经结束例&…

(转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)

http://www.xuanyusong.com/archives/2378 Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不同的游戏对象身上,他们各自都在执行自己的生命周期感觉像是多线程&…

SQL/MongoDB 连接并发测试

最近一直在搞mongodb 文件服务器大量文件并发上传测试,在官方文档发现mongo是线程安全的,支持单一连接下的并发操作。印象ADO.NET 似乎不支持单一连接并发。于是,测试一下来证实这个疑虑。(前两篇小记一直纠结mongodb吃内存导致并…

【C、C++基础】什么时候用 “.” 什么时候用“->”(3个实例搞懂)

从堆栈的角度来说: 从堆栈的角度来说: 对象放在堆上,就要用指针,也就是对象指针->函数; 放在栈上,就对象.函数 那么如何判断对象放在堆上还是栈上? 从我的另一篇笔记【C grammar】C简化内存模型可知&am…

java clone方法_Java Calendar clone()方法与示例

java clone方法日历类clone()方法 (Calendar Class clone() method) clone() method is available in java.util package. clone()方法在java.util包中可用。 clone() method is used to return the cloned object of this Calendar object. clone()方法用于返回此Calendar对象…

三、Numpy数组操作

一、对图片各个像素点的像素值进行操作 image.shape[0]:image图像的height image.shape[1]:image图像的width image.shape[2]:image图像的channels import cv2 import numpy as npdef access_pixels(image):print(image.shape)height imag…

picacg服务器维护,picacg的服务器地址是什么

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境,确保服务持久稳定运行,提升运维效率三年低至5折,多种配置可选了解详情用户数据注…

Redis-Sampler:深入了解你的Redis存储

redis-sampler 是Redis作者antirez 同学开发的一个ruby 小工具,用于对Redis存储概况进行抽样检测并给出分析结果。 项目地址:https://github.com/antirez/redis-sampler 使用方式: 下载源码,执行下面命令: ./redis-sam…

二叉树笔记(深度遍历与广度遍历+13道leetcode题目(深度3道、广度10道))

本文章为结合leetcode题目以及公众号“代码随想录”的文章所做的笔记! 感觉代码随想录的题目整理真的很好,比自己盲目刷题好很多。 目录1、二叉树小记1、满二叉树与完全二叉树2、二叉搜索树3、平衡二叉搜索树AVL4、二叉树存储方式5、二叉树遍历方式6、二…

ZZ的计算器

Problem Description ZZ自从上大学以来,脑容量就是以SB计算的,这个吃货竟然连算术运算也不会了,可是当今的计算机可是非常强大的,作为ACMer, 几个简单的算术又算得了什么呢?可是该怎么做呢?ZZ只…