.net平台的认识

重新学习下.NET框架,在这里将会对.net框架逐步的学。加深对.net的认识。

知识有限,先逐步了解下.net包含的什么。有的是从别的地方看到了。感觉不错就记下来了。

引子:什么是.NET框架

.NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境。.NET框架的目的是便于开发人员更容易地建立Web应用程序和Web服务,使得Internet上的各应用程序之间,可以使用Web服务进行沟通。从层次结构来看,.NET框架又包括三个主要组成部分:

  • 公共语言运行时(CLR:Common Language Runtime);
  • 服务框架(Services Framework)和上层的两类应用模板——传统的Windows应用程序模板(WinForms);
  • 基于ASP.NET的面向Web的网络应用程序模板(Web Forms和Web Services)。

一,什么是 CTS、CLS、CLR

(1)CTS(Common Type System)是通用类型系统。主要用于解决不同语言的数据类型不同问题,他是一种类型标准,在这个标准中不但实现了COM的变量兼容类型,还定义了通过用户自定义的方式来进行类型扩展,所以.NET平台为目标语言通过建立本身数据类型与CTS之间的映射来实现与其他语言的数据类型的交互。

 (2)CLS(Common Language Specification)是公共语言规范,主要用于实现多种语言之间的互操作性,是公共类型系统的子集。

(3)CLR(Common Language Runtime)公共语言运行库,是所有应用程序都要使用的编程基础,他如同一个支持.net应用程序运行和开发的虚拟机。

参看下图有助于了解。

二,CTS、CLS、CLR有什么用

  (1)CTS

  CTS,他定义了如何在.NET Framework 运行库中声明,使用,和管理类型,同时也是.NET Framework运行库支持跨语言基础的一个重要组成部分。

功能:建立一个支持跨语言集成,类型安全和高性能代码执行的框架。提供一个支持完整实现多种编程语言的面向对象的模型。定义各语言必须遵守的规则,有助于确保用不同语言编写的对象能够发生交互 作用。

  定义公共语言运行库在声明、使用和管理类型时所遵循的规则的模型。通用类型系统建立一个框架,该框架使得跨语言集成、类型安全和高性能代码执行成为可能。它是您可以用来生成类库的原始资料。

通用类型系统支持两种类别的类型,分别为值类型和引用类型。

  (2)CLS

  CLS即公共语言规范,它是许多应用程序所需的一套基本语言功能。CLS规则定义了通用类型系统的子集,即所有适用于公共类型系统的规则都适用于 CLS,除非CLS中定义了更严格的规则。CLS通过定义一组开发人员可以确信在多种语言中都可用的功能来增强和确保语言的互用性。CLS还建立了CLS 遵从性要求,可帮助用户确定托管代码是否符合CLS以及一个给定的工具对托管代码(该代码是使用CLS功能的)开发的支持程度。

  (3)CLR

  CLR即公共语言运行库,是.NET Framework的基础,可以将其看作一个在执行时管理代码的代理,它提供了内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。

三,.NET的3C:CTS、CLS和CLR

.NET结合Java和COM解决方案两者优点来解决互操作性问题。类似于COM定义的标准二进制格式,.NET定义了一个称为通用类型系统Common Type System(CTS)的类型标准。这个类型系统不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展。任何以.NET平台作为目标的语言必须建立它的数据类型与CTS的类型间的映射。所有.NET语言共享这一类型系统,实现它们之间无缝的互操作。该方案还提供了语言之间的继承性。例如,用户能够在VB.NET中派生一个由C#编写的类。

很显然,编程语言的区别不仅仅在于类型。例如,一些语言支持多继承性,一些语言支持无符号数据类型,一些语言支持运算符重载。用户应认识到这一点,因此.NET通过定义公共语言规范(CLS:Common Language Specification),限制了由这些不同引发的互操作性问题。CLS制定了一种以.NET平台为目标的语言所必须支持的最小特征,以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。认识到这点很重要,这里讨论的特征问题已不仅仅是语言间的简单语法区别。例如,CLS并不去关心一种语言用什么关键字实现继承,只是关心该语言如何支持继承。

CLS是CTS的一个子集。这就意味着一种语言特征可能符合CTS标准,但又超出CLS的范畴。例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。这里用的是“可能不”,而不是“不可能”,因为这一问题实际依赖于对non-CLS-compliant项的可见性。事实上,CLS规则只适用于或部分适用于那些与其他组件存在联系的组件中的类型。实际上,用户能够安全实现含私有组件的项目,而该组件使用了用户所选择使用的.NET语言的全部功能,且无需遵守CLS的规范。另一方面,如果用户需要.NET语言的互操作性,那么用户的组件中的公共项必须完全符合CLS规范。

最后一个C是公共语言运行库Common Language Runtime(CLR)。简单地说,CLR是CTS的实现,也就是说,CLR是应用程序的执行引擎和功能齐全的类库,该类库严格按照CTS规范实现。作为程序执行引擎,CLR负责安全地载入和运行用户程序代码,包括对不用对象的垃圾回收和安全检查。在CLR监控之下运行的代码,称为托管代码(managed code)。作为类库,CLR提供上百个可用的有用类型,而这些类型可通过继承进行扩展。对于文件I/O、创建对话框、启动线程等类型—— 基本上能使用Windows API来完成的操作,都可由其完成。
让我们正确看待“3C”。开发人员在构建自己的分布式应用程序时,因为用户在编程时将直接面对CLR,应将主要精力放在学习了解CLR上,而不是CTS和CLS。而对于希望以.NET平台为目标的语言和工具开发商来说,就需要深入理解CTS和CLS。互操作性组件是分布式应用的关键,因此理解.NET如何通过定义公共类型实现这一目标,也就显得十分重要。

介绍完CTS,CLS,CTS.我们来看看开发和运行.NET需要的最基本环境。

四,开发和运行.NET需要的最基本环境

我们来分析下:

(1).NET程序的开发

这个问题很简单,大部分.NET程序员都在使用微软公司提供的产品Visual Studio平台上开发.NET程序。但需要注意的是,Visual Studio IDE环境并不是惟一的、必须的工具,理论上可以使用任何一个文本编辑器编写.NET的代码,但是由于文本编辑器并不提供代码的编译调试以及语法提示等功能,所以基本上没有程序员仅仅使用文本编辑器来编写.NET代码。

(2).NET的运行

运行.NET程序的基础毋庸置疑是.NET Framework,可以在Microsfot的官方网站上免费下载.NET Framework。运行.NET程序必须具备的组件也是.NET Framework,这对于任何想运行.NET程序的操作系统来说都一样。

注意:目前.NET对于跨平台的支持做的并不好,仅仅支持Windows平台,在Linux、Unix系统上并不能直接安装.NET Framework,只能安装第三方的Mono作为.NET Framework的替代,但Mono同.NET Framework的兼容性以及更新的速度等一系列问题,导致目前使用Mono开发的项目相对较少。

总结:

开发和运行.NET程序必需安装.NET Framework组件,当然也必须安装Visual Studio IDE(虽然理论上文本编辑器也可以编写.NET代码,但实际上程序员都会安装微软公司的Visual Studio产品)。

我们对其环境也知道了,现在我们来看看.NET的运行机制是什么

五,.NET的运行机制

  (1).NET程序被编译成什么形式的代码

  .net程序在第一次编译后,形成CLR头,元数据和中间代码。

  在实时运行或者部署时,进行第二次变异,编译的结果是在CLR中可以执行的机器代码;

  -CLR头包含了.net在运行该程序时得到的信息,包括程序集版本号,文件名和模块版本号。

  -MetaData包含了所有类型的定义,所有的引用以及程序集清单。

  (2) JIT是如何工作的

  JIT引擎在编译中间代码之前,会寻找本机机器代码缓存并且确认是否可用:

  - 如果可以用,则直接加载;

  -  如果不可用,JIT引擎会查找类型中的方法存根,找到中间代码并且进行编译。

  (3)简述程序集的加载机制

  CLR通过System.Reflection.Assembly.LoadFrom和System.Reflection.Assembly.Load来主动加载程序集:

  - 前者通过位置加载程序集;

  - 后者通过 唯一标识 强命名程序集 的四个元素来标识程序集;

  它们的加载方式一致,其内在策略是依次通过版本策略,CODEBASE位置,应用程序域位置和程序位置来查找程序集。

  (4)如何配置程序集的版本策略

  CLR支持3个级别上设定版本策略,依次是:应用程序策略,发行者策略和计算机策略。

  所有的策略的设置都是通过修改配置文件来实现的。3个级别策略依次会被CLR执行,而上一个策略的执行结果将被作为下一个策略的输入。

  发行者策略仅仅对那些被放入GAC(缓存)的程序集,并且可以再应用程序策略中被忽略。

既然上面提到程序集了,下面我们来看看什么是程序集。

六,什么是程序集和应用程序域

程序集和应用程序域是.NET框架中比较基本的概念,每个.NET程序员都在日常工作中不断地与其打交道。程序集和应用程序域是.NET程序打包和部署的基础,读者需要清楚地理解其基本概念。

所涉及的知识点

  • 程序集的基本概念

  • 应用程序域的基本概念

分析问题

首先来解释程序集的概念。程序集(Assembly)是一个或多个模块和资源文件的集合。当一个程序集被打包形成时,它不仅会包含所有的原始文件内容,也会添加一个程序集清单,该清单包含了程序集的版本号、语言、发布者、导入类型等信息。有趣的是,程序集清单可以被添加到程序集中的某个文件之上,编译器也可以为程序集清单单独创建一个文件。

程序集是一个逻辑上的概念,而不是指一个或几个物理文件或者代码段。

程序集概念的引入,给系统的设计和部署带来了很大的灵活性。

(1)程序集支持多编程语言开发,就是一个程序集可以包含由不同编程语言定义和实现的模块。在程序集被编译形成时,所有这些类型已经被编译成中间代码,而不再带有原来编程语言的特性。

(2)程序集允许逻辑分布和物理分布分离。这样虽然同属于一个逻辑程序集,各种类型和资源仍然可以分布在不同的物理文件里。这大大地提高了系统部署的灵活性。例如程序员可以把某个程序集分成四个文件,分别包含基本类型定义、基本HELP文档、可选类型定义和可选HELP文档。这样在部署该系统时,可以让用户选择需要的功能,并且按照用户的选择从服务器下载必要的文件来组成程序集。

包含了程序集清单的那个文件对使用该程序集来说是必需的。

接下来看一下应用程序域的概念,同样,这是一个.NET提出的新概念。在操作系统中,一个普通的应用程序通常占据一个操作系统的进程。操作系统的进程为应用程序提供了独立的内存空间,规定了代码的执行范围,并且提供了错误隔离机制。在.NET框架中,应用程序域(AppDomain)提供了和操作系统进程非常类似的功能。一个在CLR中运行的应用程序,将至少拥有一个应用程序域。和操作系统的进程相同,应用程序提供了代码的执行范围,并且为程序提供隔离。在多个应用程序域间通信是非常困难的,每个类型实例都会存放在一个应用程序域内,并且,所有域内的引用必须引用自己所在应用程序域的对象。

和操作系统的进程不同的是,应用程序域的创建和销毁所需要的开销会相对较小。当然,CLR仍然在操作系统上运行,所以某个应用程序域必定运行在某个操作系统的进程内,在CLR的安排下,每个操作系统的进程也可以包含多个应用程序域。图2.2表示了这种组织结构。

答案

程序集(Assembly)是一个由类型定义、数据文件和资源文件组成的逻辑集合。每个程序集都包含一个程序集清单,该清单通常被附加在某个文件头上,也可以设置单独建立一个文件来包含该清单。

应用程序域是CLR中提供代码运行范围、错误隔离和安全设置隔离的逻辑单元,功能类似于操作系统的进程。一个或多个应用程序域在一个操作系统的进程中运行。应用程序域的创建和销毁所需的开销,相对于操作系统进程较小。但和操作系统进程一样,应用程序域之间的数据共享相当困难。

现在我们在来看下,程序集的版本分为哪些组成?

七,程序集的版本分为哪些组成?

每一程序集都有一个版本号作为其标识的一部分。 因此,如果两个程序集具有不同的版本号,运行时就会将它们视作完全不同的程序集。 此版本号实际表示为具有以下格式的四部分号码:

<主版本>.<次版本>.<生成号>.<修订号>

例如,版本 1.5.1254.0 中的 1 表示主版本,5 表示次版本,1254 表示生成号,而 0 则表示修订号。

版本号与其他标识信息(包括程序集名称和公钥,以及与该应用程序所连接的其他程序集的关系和标识有关的信息)一起存储在程序集清单中。

在生成程序集时,开发工具将把每一个被引用程序集的依赖项信息记录在程序集清单中。 运行时将这些版本号与管理员、应用程序或发行者设置的配置信息结合使用,以加载被引用程序集的正确版本。

为进行版本控制,运行时会区分常规程序集和具有强名称的程序集。 只对具有强名称的程序集执行版本检查。

有关指定版本绑定策略的信息,请参见 配置文件。 有关运行时如何使用版本信息查找特定程序集的信息,请参见 运行时如何定位程序集

八,什么是托管代码?什么是非托管代码?

托管代码 (managed code)
由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。

  在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。

非托管代码 (unmanaged code)

  在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。

问题:什么是托管?托管是什么意思?

托管代码就是基于.net元数据格式的代码,运行于.net平台之上,所有的与操作系统的交换有.net来完成,就像是把这些功能委托给.net,所以称之为托管代码。非托管代码则反之。

举个例子l

Vc.net还可以使用mfc,atl来编写程序,他们基于MFC或者ATL,而不是.NET,所有是非托管代码,如果基于.net比如C#,VB.net则是托管代码

非托管代码是指.NET解释不了的

简单的说,托管代码的话,.net可以自动释放资料,非托管代码需要手动释放资料.

时间: 2024-07-28 17:03:04

.net平台的认识的相关文章

谭八爷代理订货平台系统

谭八爷代理订货平台系统  135.3879.3268   谭八爷微商下单系统.谭八爷微商管理系统.谭八爷代理商下单系统等.模式系统开发 传统行业和内容提供本质没有变,但是在结合互联网后的商业模式和运营模式变了,如当前我们谈的多的O2O,核心不是内容提供变化了,是商业模式变化了,这个商业模式变化本身又依托了一个重要假设,即解决了传统行业原有的信息不对称问题. 谭八爷微商平台系统开发的注册流程是非常简单的--扫码注册.同时后台的功能也很强大,代理们收到顾客订单后可以直接在后台向公司下单,同时后台也会

家电二维码售后服务平台系统开发

家电二维码售后服务平台系统开发,家电二维码售后系统开发,小吴183.2071.6434微电,家电二维码售后软件开发,家电二维码售后平台开发. 互联网平台的节点有两大类型:第一基数节点,也就是弱连接的节点,其规模要大,越大越好,互联网的价值与节点数的平比成正比.第二活跃节点,也就是强连接的节点,其能量要强,越强越好,互联网的价值与其强度成正比. 一.家电维修行业"维修黑幕"层出不穷 记者从一位从事家电维修人士那里了解到,目前行业公认当前家电维修行业有陷阱,"维修黑幕"

category is in invalid format hint微信第三方平台将第三方提交的代码包提交审核出错

微信第三方平台通过接口https://api.weixin.qq.com/wxa/submit_audit?access_token=TOKEN将第三方提交的代码包提交审核时一直返回错误码85008的错误信息: category is in invalid format hint 查了半天是接口提交数据时json_encode时中文不能编码提交 将向微信的提交代码     $this->https_post($url,json_encode($postData)); 改为     $this->

基于Spark MLlib平台的协同过滤算法---电影推荐系统

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,

ZYNQ 7000平台UDP数据包(1字节或2字节)校验和Checksum错误0xFFFF解决方案(linux+vxworks6.9平台)

在赛灵思ZYNQ 7000平台,使用UDP方式发送1字节或者2字节数据时,校验和为错误值0xffff,接收机无法正常接收ZYNQ7000平台发送的数据,本人已经找到该问题的解决方案,有该问题的朋友可以通过邮箱[email protected]与我联系,联系时请详细描述你的环境,针对该咨询提供的问题解决方案会收取一定的费用,费用不会太高,现在是知识付费的年代,希望各位理解,同时如果能够解决您的问题,也是为你节约了开支.我会及时回复邮件的.具体事项可以邮件沟通[email protected].

微信公众平台的最新功能详细介绍与使用技巧!

近日微信官方发布消息,微信公众平台的操作进行了又一次"感天动地"的更新 且听我一一道来 本次主要重要改(Geng)革(Xin)凸显在三个地方 改(Geng)革(Xin)一:图文模版的收藏与使用 这,真的是一个超级实用的功能呀,那么如何使用呢?在哪里找呢? 首先告诉大家,如何收藏图文模板 选中编辑区的部分或者全部素材,然后点击添加模版,图文模板即可收藏成功: 当然,你还可以从外部进行粘贴和复制内容到图文模版. 那么,在哪里找到我收藏的模版呢?? 嗯,就在添加图文模版的旁边啦! 同时,你还

政府部门没组织机构代码、法人证书,怎么开通认证微信公众平台?

政府机关微信公众号认证流程:1.确定需要认证的名字:如xx大队.xx局:2.准备资料:单位证件.运营人身份证.联系手机.登陆邮箱:3.确定类型:订阅号or服务号:资料准备好后,可直接联系公众平台服务商"杰客科技"的客服人员,2天内便可完成认证. 注意事项:1.政府机关认证时需要盖章,没有公章将无法认证:2.公众号认证后,排名将更靠前并显示v标志. 政府微信公众平台开通及认证:http://www.jcjclu.com/apply/201603149.html客服QQ:180805782

微信公众平台开发—利用OAuth2.0获取微信用户基本信息

1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url获取微信回传code值(appid可在微信平台下找到) 1).微信不弹出授权页面url: A.code回传到页面wxProcess2.aspx,不带参数 [csharp] view plain copy Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&

用gson和httpclient调用微信公众平台API

吐槽:微信api很无语,部分用xml,部分用json. 最近在找如何调用微信公众平台关于json相关的api比较方便,最后发现httpcliect和gson不错.如果你有更好的方式,请告诉我. 以下代码先了解如何使用gson和httpclient,有功夫再整到我的sophia里 import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.

微微信.NET:开源的ASP.NET微信公众号应用平台

题记: 平时喜欢使用 C# 编程,近半年玩微信公众平台,看到一些微信的应用系统大多是PHP.Python的,于是就有想法做一套开放的 C# ASP.NET的微信应用系统. 微微信.NET  基于ASP.NET的开源微信应用平台  --(面向客户完全开源 永久免费代码更新 游戏和点餐菜单正在完善中 很多功能继续优化) 微微信.NET  系统设计架构         本系统基于文件系统和内存数据库,标准板运行于.NET4,完全版需要单独的服务器或者VPS支持          本系统是一个开源系统,