这是我的第一篇博文,目前这一阶段我的目标是先把C#掌握好,C#是一门语言,是基于C风格语言(C、C++和Java)的特性而设计的。所以在我的博客里,我会记录下我的学习笔记,这不仅仅是笔记,还是所学过的知识汇总,希望对C#有一个较为全面的总结,以便日后的查阅更加方便。

本文主要介绍C#的运行环境,包括C#的执行过程、CLI、“运行时”等内容。


一、C#的执行过程

1、第一步,得到C#源代码文件

一般是.cs作为后缀(其实C#编译器允许为C#源代码文件使用任何文件扩展名)。

2、第二步,由C#编译器进行编译,得到程序集(assembly);

程序集有两种形式:一种是可执行文件.exe;另一种是类库文件.dll(Dynamic Link Library,DLL,动态链接库)。

程序集采用的是另一种语言,即公共中间语言(Common Intermediate Language,CIL),或简称为中间语言(IL),第三种说法是Microsoft IL(MSIL)。

3、第三步,再进行一次编译,CIL被转换为处理器能够理解的机器码(machine code);

由“运行时”内部的一个组件来执行从CIL到机器码的编译,这个组件称为即时编译器(just-in-time compiler,即JIT),这个过程称为即时编译或JIT编译(just-in-time compilation) 。

通常在执行时发生,也有可能在程序安装时发生。

4、第四步,代码要想执行,仅仅转换为机器码是不够的,C#程序还需要在一个代理的上下文中执行,负责管理C#程序执行的代理就是VES(Virtual Execution System,虚拟执行系统);

VES也被叫做“运行时”(runtime)(“程序执行的时候”用执行时来表示)。

CLR(公共语言运行时)正在逐渐称为运行时的一个常用代名词,这个术语更像是微软专门针对.NET平台实现的“运行时”。

“运行时”负责管理C#程序的执行,负责加载和运行程序,并在程序执行时提供额外的服务(这些服务不需要开发人员显示地编码)。

假如代码在像“运行时”这样的一个“代理”的上下文中执行,就将这些代码称为托管代码(managed code),执行过程中不需要“运行时”的代码称为本机代码(native code)或者非托管代码(unmanaged code)。

C#的底层平台是“运行时”(VES)。

5、反汇编

给定一个程序集(DLL文件或可执行文件),可以使用CIL反汇编程序将其析构成对应的CIL表示,从而查看其CIL代码。通常使用微软特有的文件名ILDASM来称呼这种CIL反汇编程序(ILDASM是IL Disassembler的简称),它能对程序或者它的类库执行反汇编,显示由C#编译器生成的CIL代码。

事实上,一些免费工具可以将CIL自动反编译成C#,比如Red Gate Reflector、ILSpy、JustDecompile、docPeek、CodeReflect等。

无论是否基于CLI,任何程序防止反编译唯一安全的方法就是禁止访问编译好的程序(例如,只在网站上存放程序,而不把它分发到用户机器上)。但假如目的只是减小别人获得源代码的可能性,可以考虑使用一些混淆器(obfuscator)产品。这些混淆器会打开IL代码,将代码加密成一种功能不变但更难于理解的形式。这可以防止普通开发者访问代码,使程序集难以被反编译成容易理解的代码。除非程序需要对算法进行高级安全防护,否则混淆器足矣。

二、CLI(Common Language Infrastructure,公共语言基础结构)

1、简介

CLI是在运行时管理C#程序的执行引擎。

CLI没有规定标注具体如何实现,但它描述了一个CLI平台在符合标准的前提下应该具有什么行为。

CLI标准包括以下更详细的规范:

①虚拟执行系统(VES,即常说的“运行时”);

②公共中间语言(Common Intermediate Language,CIL);支持多种语言;

③公共类型系统(Common Type System,CTS);为语言互操作性提供支持的类型系统;

④公共语言规范(Common Language Specification,CLS),包含如何编写能通过CLI兼容语言访问的库的指导原则;

⑤元数据(Metadata);

⑥公共编程框架(Framework);

⑦基类库(Base Class Library,BCL);

2、CLI实现

目前有7种主流的CLI实现(4种来自微软),各自都实现了一个C#编译器。

①Microsoft Visual C# .NET Compiler:业内最主要的编译器,但只能在Windows操作系统上运行,它作为Microsoft .NET Framework SDK的一部分免费提供给用户下载和使用;

②Microsoft Silverlight:这是CLI的一个跨平台实现,能同时在Windows和Macintosh操作系统上运行;

③Microsoft Compact Framework:.NET Framework的一个精简,设计成在PAD和手机上运行;

④Microsoft XNA:游戏开发人员使用的CLI实现,面向的是XBOX和Windows Vista;

⑤Mono Project:开源的CLI实现,提供了CLI规范及C#编译器的Windows、Linux、UNIX兼容版本;

⑥DotGNU:侧重于创建平台可移植应用程序,使其能够同时在CLI的.NET和DotGNU.Portable.NET实现下运行;

⑦Rotor:也称为Shared Source CLI,是微软开发出来在Windows、Mac OS、FreeBSD上运行的一个CLI实现;

注意每个CLI和C#编译器实现和规范相符的程度是不一的。

3、“运行时”提供的服务

如果是一个CLI实现的上下文中运行,程序员不需是要直接写代码,“运行时”和托管执行提供了大量服务和功能

①垃圾回收:根据程序的需要自动分配和回收内存的过程。

对于没有自动系统来做这件事的语言来说,这是一个严重的编程问题。如果不亲自回收已经分配出去的内存,就会造成内存泄漏。

.NET平台实现的垃圾回收机制使用一个分代的(generational)、支持压缩的(compacting)以及基于mark-and-sweep(标记并清除)的算法。

②类型安全:检查类型之间的转换,;

通过类型检查,“运行时”防止了程序员不慎引入可能造成缓冲区溢出安全漏洞的非法类型转换。此类安全漏洞是最常见的计算机入侵方式之一。

③代码访问安全性(Code Access Security,CAS):根据权限来允许或禁止特定类型的操作。;

④平台可移植性:理论上允许C#代码和最终的程序具有平台可移植性;

⑤语言互操作性;

⑥BCL;

C#基础之运行环境的更多相关文章

  1. Hadoop基础教程-运行环境搭建

    一.Hadoop是什么 一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. Hadoop实现了一个分布式 ...

  2. Vue.js 运行环境搭建详解(基于windows的手把手安装教学)及vue、node基础知识普及

    Vue.js 是一套构建用户界面的渐进式框架.他自身不是一个全能框架——只聚焦于视图层.因此它非常容易学习,非常容易与其它库或已有项目整合.在与相关工具和支持库一起使用时,Vue.js 也能完美地驱动 ...

  3. 【netcore基础】CentOS 7.6.1810 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动

    之前写过一篇Ubuntu的环境搭建博客,感觉一些配置大同小异,这里重点记录下 nginx 作为静态 angular 项目文件服务器的配置 参考链接 [netcore基础]ubuntu 16.04 搭建 ...

  4. 【netcore基础】ubuntu 16.04 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动

    今天来整理下 netcore 在 linux(ubuntu) 上的运行环境搭建 对应版本 ubuntu 16.04 .net core 2.1 nginx version: nginx/1.10.3 ...

  5. JDK+Tomcat搭建JSP运行环境--JSP基础

    一.搭建JSP运行环境之前需要了解的基本知识 配置JSP运行环境之前,我们需要了解JSP的运行机制.只有了解JSP运行机制后,我们才能知道为什么要搭建JSP运行环境?如何去搭建JSP运行环境?为什么要 ...

  6. java 零基础搭建dubbo运行环境

    一:简介    以前做项目时,分布式环境都是其它同事在搭建,自己也没参与分布式环境搭建,只负责开发,由于近段时间工作重心转到android,java后台有一段时间没有接触了,刚好这几天有空,决定自己动 ...

  7. 【Hadoop离线基础总结】Apache Hadoop的三种运行环境介绍及standAlone环境搭建

    Apache Hadoop的三种运行环境介绍及standAlone环境搭建 三种运行环境 standAlone环境 单机版的hadoop运行环境 伪分布式环境 主节点都在一台机器上,从节点分开到其他机 ...

  8. 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  9. Python 2/3 安装与运行环境设置

    Python 2/3 安装与运行环境设置: 1.Python 软件源:https://www.python.org/    下载Win版本 https://www.python.org/downloa ...

随机推荐

  1. bzoj 3501 PA2008 Cliquers Strike Back —— 贝尔数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3501 用贝尔三角预处理贝尔数,拆模数并在 \( p \) 进制下使用公式,因为这样每次角标增 ...

  2. 二叉树遍历入门 Lebal:research

    解决二叉树遍历的画法 对于二叉树的基本概念,一般学生都知道,但对于二叉树的遍历,在实际运用中可以发现很多问题,这里提供一次性彻底解决这个问题的方法. 二叉树的遍历 二叉树的遍历是指不重复地访问二叉树中 ...

  3. python中re.sub的使用 --解读一段代码

    json='{ title: "条纹针织衫+蓬蓬裙套装", picSrc: "http://d05.res.meilishuo.net/pic/_o/15/f5/f2e2 ...

  4. 深入理解和探究Java类加载机制

    深入理解和探究Java类加载机制---- 1.java.lang.ClassLoader类介绍 java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字 ...

  5. Ubuntu 12.04搭建hadoop单机版环境

    前言: 本文章是转载的,自己又加上了一些自己的笔记整理的 详细地址请查看Ubuntu 12.04搭建hadoop单机版环境 Hadoop的三种运行模式 独立模式:无需任何守护进程,所有程序都在单个JV ...

  6. 读取web应用下的资源文件(例如properties)

    package gz.itcast.b_resource; import java.io.IOException; import java.io.InputStream; import java.ut ...

  7. 打包python文件为exe文件(PyInstaller工具使用方法)

    最近做的新浪微博爬虫程序,打算打包成.exe软件以方便使用,网上找到一个很好的打包工具pyinstaller,这里记录一下打包的方法. 一.下载pyinstaller 我使用的版本为PyInstall ...

  8. 使用go实现基于命令行的计算器程序

    项目目录结构 calcs.go源文件 package main import ( "fmt" "os" "strconv" "my ...

  9. CentOS6下用yum升级系统最新内核版本

    首先当你决定升级内核时,要想清楚为什么升级内核,因为升级内核会带来很多麻烦.所以这种事情能避免就避免 导入 Public Key rpm --import https://www.elrepo.org ...

  10. Fitnesse框架简单介绍

    1.Fitnesse是什么? 官方的说明:FitNesse is a wiki server. It's also a test execution engine. Fitnesse是一个wiki s ...