什么是.NET架构

2023-11-15

 
什么是.NET架构

.NET架构主要分为3部分

FCL – Framework Class Library

CTS – Common Type System (其中包括Common Language Specification

CLR – Common Language Runtime

这三层从高到底,越高代表越接近应用程序,越低代表越接近内核。

.NET最主要的思想是从JVM Java Virtual Machine)得来的,换句话说,就是使用一种“中间层”来代替原本的PE可执行文件格式。CILCommon Intermediate Language)一般来说都是已经编译好的,是用JITJust-In-Time)动态执行。

CTS层提供一般常用的数据类型,而其中的CLS模块包含所有的.NET应用程序都需要共享的数据类型。

具体来说,从最底层的CLR来看,CLR是所有.NET应用程序的引擎。主要包括由jitterJust-In-Time Compiler)生成的CIL代码,垃圾回收器(Garbage Collector,不知道中文名是什么)CTS与异常处理机制。

CLR中最重要的一点就是受控代码(Managed Code),在受控代码的控制下,程序中永远不会出现失去胡乱引用的指针。

但受控代码绝对不等于解释语言,受控代码只是为了保证在运行程序是内存与类型的安全。

所有的.NET应用程序都会被编译成CIL(原先CIL被命名为MSIL – MicroSoft Intermediate Language)。实际上,在.NET编译后同样会生成PE可执行代码,不同的是这种PE格式在某一个位做了标示,用来代表这个文件包含了CIL.NET metadata。这些PE文件的所有对象的入口处都会有一段代码用来呼叫JIT模块,从而在代码执行前动态编译当前执行的方法(Method,对应Class),生成对象代码后执行编译后的代码。

这样看来,我们很显然就能够看出这种方法的优缺点。

缺点:由于第一次执行需要编译,所以会需要消耗时间。

但是这种被消耗的时间相当短,并且只有在第一次执行时才会消耗时间。

优点:由于是在CIL之上动态编译执行,因此在不同的平台上(比如XP2003)会根据需要做相应的优化,从而提高执行效率

同时,对于不经常用到的模块在编译之前并不会占用内存。在大型的项目中这点可以节约不少的资源。

内存与垃圾回收机制:

对于一个C或者C++的程序,最令人头疼的就是当调试完成后调试程序汇报存在内存泄路。而.NET的垃圾回收机制可以有效地克服这个问题。同时在保证内存安全释放的前提下,.NET的垃圾回收机制的效率也是相当优化的。

首先我们来看内存回收机制的效率,这也是所有希望使用.NET开发系统的人们最为关心的事情。

.NET的内存回收机制实际上是建立在一个法则之上的。对于一个应用程序,大部分内存都会在被分配后很短的时间内释放,剩下的那部分中绝大部分可能会保持到几秒钟至分钟级别,在其次的一部分则看起来会被终身保留在内存中。

因此,.NET的内存回收机制也采用三段式。

当系统分配了足够多的内存(一般是由CPU的二级缓存的大小决定的),当.NET决定对内存进行整理的时候,.NET会对最近分配的块进行检查,也就是第0级。实际上,.NET只需要注意依然被使用的内存。从而将这些内存物理地移动到分区的最下方,同时标注这些内存为第一级。这样,当下次再作清理的时候,这些被标注为第一级的内存不会被检查到。而此时,由于所有正在被使用的内存被移到了分区的下方,剩下的则是可以使用的剩余内存了。

只有当检查完第0级后发现内存依然不够,这时系统会对第一级做内存回收。

同理,回收后依然被使用的内存移动到分区最下方,标注为第二级,剩下的也就是可以被使用的内存了。

当第一级回收完毕后系统发现依然需要更多的内存,这时才会对第二级进行清理。不过第二级不会再继续提高到第三级,这也就是我们为什么说它是“三段式”。

现在我们再来详细地介绍一下CTS。我们知道当一个应用程序运行在.NET平台上时,不管它是使用什么语言编写的,他们都有相同的特性:能够被JIT动态编译执行。

这样就存在一个问题。有一些类可能是由一种语言编写的,却在另一种语言中得到应用。怎么能够让不同的类跨越语言,比如一个类原本是由C#写的,然后在VB中得到了进一步的封装与应用,最后这个被封装的类用于Delphi的一个组件中。

因此,保证不同语言编写出的类不会被错误地强制转换是CTS最主要的职责之一。

就好像Delphi一样,.NET中所有的类都是从一个基本类System.Object派生出来的。因此,不同的语言需要提供的只是对一个个类的引用与继承。

对于接口的提供,.NET由于使用内存回收机制而不是用引用计数。所谓的引用计数就是指由平台对每一个所引用到的接口保存一个计数器。计数器的数值表示了当前有多少对象在使用它。当计数器为0时,这个接口或者对象所使用的内存会被回收。

取消了计数器可以为应用程序带来更快的速度与更简洁的架构,但是同时会减弱程序对非法引用的保护性。但是如今.NET只提供这一种方法,也许将来可能会提供两种接口的编写方式吧。

框架:框架是.NET架构中最上方的一层,也是直接面向程序员编写程序的这一层。比如C#提供了上千个类型用于程序的开发(实际上我们能够接触到的远没有这么多,这里的上千个包括了微软内部使用的类)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是.NET架构 的相关文章

  • 具有多个键的 ToLookup

    有没有办法需要多个密钥 ToLookupLINQ提供的功能 我承认这一开始似乎不直观 我希望没有实际的方法可以做到这一点 但我希望有人知道一种方法 我基本上希望能够通过两个值进行查找 例如string and an int 并检索具有这两个
  • 如何在 C# 中绘制蜡烛图 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何在 C 中绘制蜡烛图 有人有任何界面漂亮的例子吗 我用过MSChart http code msdn
  • 为什么单击 ToolStrip 按钮两次时会引发 NullReferenceException - openFileDialog.showDialog()?

    我创建了一个干净的 Windows 窗体应用程序解决方案 添加了ToolStrip到主窗体 并在其上放置一个按钮 我还添加了一个OpenFileDialog 所以这样Click event of the ToolStripButton看起来
  • GetReferencedAssemblies 不返回所有程序集

    我在表单中有以下代码 并试图找到一种方法来加载由名为的表单引用的项目程序集DataObjects 使用以下代码 我只列出了六个程序集 查看表单所在项目的引用 有十三个程序集引用 这里有什么问题吗 private void ListRefer
  • 如何检查应用程序的 .NET 版本?

    除了在仅具有 NET Framework 版本 3 5 的计算机上运行之外 如何检查 NET 应用程序的版本 NET 框架版本控制在 NET 2 0 之后变为 foobar 一个应用程序的目标是CLR版本 它使用 EXE 的程序集元数据来实
  • C# 计算图像差异

    我怎样才能生成一个System Drawing Image包含其他两个图像的像素之间的差异 类似的东西确实如此 但是用 C 编写 The 算法 https github com Phrogz context blender blob mas
  • 如何根据输入的内容过滤组合框的内容?

    我们有一个包含 100 多个项目的组合框 当我们在组合框中输入字符时 我们想要过滤掉项目 例如 如果我们输入 ac 并单击下拉选项 那么我们希望它仅显示以 ac 开头的项目 我怎样才能做到这一点 也许您会更喜欢使用操作系统内置的自动完成功能
  • 是否可以在 .NET 中编写仅接受数字类型的通用函数?

    假设我想编写一个如下所示的函数 像往常一样 一个简单的示例用于说明目的 Public Function calcSqSum Of T ByVal list As IEnumerable Of T As T Dim sumSq As T Fo
  • .NET Compact Framework 应用程序中的版本号

    我需要在屏幕上显示 NET Compact Framework 版本号 我将 NET CF 2 0 与 Windows CE 4 0 结合使用 到目前为止 我完全忽略了版本号 我需要向程序集中添加任何内容吗 我如何以编程方式检索它 不幸的是
  • Directory.CreateDirectory 延迟问题?

    我正在尝试创建一个远程目录 然后向其中写入一个文件 每隔一段时间 应用程序就会在尝试写入文件时失败并出现 System IO DirectoryNotFoundException 当我写入文件时 我使用返回的 DirectoryInfo 对
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • JQuery、ASCX 和 webmethods 似乎不起作用

    我有一个级联下拉列表 其中 3 个 类型 类别和子类别 首先类型负载 然后选择类型 类别负载以及选择类别 子类别负载 我还有 2 个按钮 添加类别 和 添加子类别 单击这些按钮后 我调用 JQuery 模态表单来添加它们 我在代码后面使用
  • ScrollableControl 在整个控件周围绘制边框

    我正在构建基于的自定义用户控件ScrollableControl 现在我正在尝试在控件周围添加边框 类似于 DataGridView 的边框 我可以使用以下方法绘制边框 e Graphics TranslateTransform AutoS
  • 改进绩效反思 - 我应该考虑哪些替代方案?

    我需要动态地设置对象上的一堆或属性的值 将其称为传输对象 将在短时间内创建相当数量的此类传输对象并设置其属性 我想避免使用反射 还有其他选择吗 如果是的话 有我可以查看的示例实现吗 Use Delegate CreateDelegate h
  • 使用 C# 启动 Outlook

    我可以让 C 在代码中启动 Outlook 吗 在 VB6 中 我们使用对象 Outlook Application 并编写 Set oOutlook CreateObject Outlook Application Set oNameSp
  • 我应该始终使用 TryGetValue 来访问 .net 词典吗?

    In 另一个问题 https stackoverflow com questions 886814 why doesnt net provide us with the key when it raises a keynotfound ex
  • 使用 Rhino Mocks 模拟集合

    所以我猜这是很多人想做的事情 模拟集合 过去我用 Rhino 做过这样的事情 var col mock MockRepository GenerateMock
  • 用户“NT AUTHORITY\ANONYMOUS LOGON”的 Web 应用程序登录失败

    我看到很多人都遇到这个错误 但他们的情况似乎都与我的有点不同 我有一个 ASP NET 4 0 Web 应用程序 它在 Windows 2003 Server 上的 IIS 6 0 中运行 当我远程到 Web 服务器框并登录并访问该站点时本
  • 代表和结构的速度问题

    我遇到了一些与结构和委托有关的速度问题 采用以下控制台应用程序代码 public delegate string StringGetter public class LocalString public LocalString string
  • 如何从 Windows 10 卸载 .net Framework 4.8

    我安装了 Windows 10 和 net Framework 4 7 2 并且我的程序运行良好 然后我想尝试一下 net Framework 4 8 安装后 我的程序无法运行 我试图卸载 net Framework 4 8 我从控制面板进

随机推荐

  • 手撸算法-两数之和-牛客

    描述 给出一个整数数组 请在数组中找出两个加起来等于目标值的数 你给出的函数twoSum 需要返回这两个数字的下标 index1 index2 需要满足 index1 小于index2 注意 下标是从1开始的 假设给出的数组中只存在唯一解
  • 记一次映射公网地址FTP服务问题的解决方法

    因为需要FTP公网进行访问 遂在公司搭建FTP服务使用软件 免费开源的Fillzilla Server版本 当然这不是主要的添加用户密码 用户访问目录 更改21端口为21212出现棘手问题 因为公司使用cisco路由器公网接入 默认所有公网
  • JavaWeb 文件上传和下载

    目录 一 文件上传 1 文件上传和下载的使用说明 2 文件上传基本原理 3 文件上传经典案例 3 1 页面实现 3 2 servlet实现 3 3 工具类实现 3 4 运行测试 3 5 注意事项 二 文件下载 1 文件下载基本原理 2 文件
  • 2023年自学网络安全学习路线,收藏这一篇就够了(超详细)

    00 网络安全为啥突然 火 了 随着网络空间成为第五空间 社会基础产业全面互联网化 网络安全 或称广义的信息安全 面临的威胁越来越大 对网络安全的人才需求也呈现出井喷趋势 即使目前很多人可以自学成才 网络空间安全 也成为一级学科 但根据 第
  • js动态加载js和css

    一 动态加载CSS动态创建css样式有两种方式 1 动态插入css外部文件的方法 function loadStyle url var link document createElement link link type text css
  • Android Instrumentation模拟鼠标点击事件

    看了几遍网上的博客一直没有 模拟出鼠标点击事件和按钮事件 后来抱着试试态度再重试的时候终于有所斩获 下面把具体的情况记录一下 首先我们必须了解类 Instrumentation Instrumentation发送键盘鼠标事件 Instrum
  • 什么是DNS服务器?有哪些作用?

    什么是DNS服务器 DNS服务器是 Domain Name System或者Domain Name Service 域名系统或者域名服务 域名系统为Internet上的主机分配域名地址和IP地址 用户使用域名地址 该系统就会自动把域名地址转
  • 智能一体化运维平台(一)java实现ssh连接

    一 思路 1 作为java的web后台应用 在做ssh连接的时候 比如导入所需要的协议jar包 如ssh jar 本次测试 本人使用的是 2 导入jar包后 开始进入代码编程 首先需要进行创建用户名 密码 端口 ip地址等变量 用来存储对应
  • 腾讯云技术分享:MySQL AHI 实现解析

    MySQL 定位用户记录的过程可以描述为 打开索引 gt 根据索引键值逐层查找 B 树 branch 结点 gt 定位到叶子结点 将 cursor 定位到满足条件的 rec 上 如果树高为 N 则需要读取索引树上的 N 个结点并进行比较 如
  • linux 线程和进程的区别与联系::

    进程 承担分配系统资源的基本实体 线程 调度的基本单位 线程是进程里面的执行流 线程在进程的地址空间内运行 linux中没有真正意义上的线程 线程是用进程模拟的 地址空间上 线程没有自己独立的地址空间 共享进程的空间 但是进程包含独立的地址
  • 微信小程序-“授权失败”场景的优雅处理

    微信小程序中提供了相关API 让开发者能获取到微信用户的相关信息 在首次去获取的时候会展示一个用户是否同意授权的对话框 发现有不少线上的小程序都没有处理好用户 拒绝授权 导致的 授权失败 场景 一个观点 私认为 开发微信小程序在用户授权上有
  • 蘑菇街前端面试

    vue与jquery的区别 为什么现在很多人使用vue vue怎样实现双向数据绑定 内部原理 1 jQuery首先要获取到dom对象 然后对dom对象进行进行值的修改等操作 2 Vue是首先把值和js对象进行绑定 然后修改js对象的值 Vu
  • iview Table中switch值无法刷新问题

    table里面的开关在修改状态以后 翻页后状态不在变化 render h params gt return h i switch props size large value params row filterContact on可以传入绑
  • Tkinter 组件详解(七):Entry

    Tkinter 组件详解之Entry Entry 输入框 组件通常用于获取用户的输入文本 何时使用 Entry 组件 Entry 组件仅允许用于输入一行文本 如果用于输入的字符串长度比该组件可显示空间更长 那内容将被滚动 这意味着该字符串将
  • leetcode刷题——多维枚举(一)

    题目一 思路 双指针 bool isSubsequence char s char t int fast 0 int slow 0 while slow
  • JavaWeb之Servlet详解

    文章目录 一 什么是Servlet 二 Servlet 1 Servlet是如何起作用的 2 Servlet接口中的方法 3 Servlet对象的生命周期 三 ServletConfig 1 什么是ServletConfig 2 Servl
  • MOS驱动自举电容和限流电阻的选取

    自举电容选取 最近做逆变时出现了异常 使用2104驱动MOS管 蓝色为滤波后双端带载时出现的波形 一端带载时没有问题 放大波形后发现输出波形在占空比满值时垮掉 产生严重的震荡 可以看到波形顶部斜向下 我们可以推断是驱动自举电容值偏小 当占空
  • ARMv8-A 地址翻译技术之MMU的前世今生

    MMU的重要性不言而喻 支撑操作系统之上的各种复杂应用 但在正式讲MMU之前 我们先说说MMU的发展史 因为ARMv8 A的MMU相当复杂 直接切入正题 会显得比较枯燥 废话不多说 咱们马上开始 一 前言 关于虚拟内存系统的演变史 MMU在
  • 计划 060703

    ESOE项目暂时作为一个自娱型项目 每日投入30分钟 近期按计划完成以下工作 1 完成计划 ok 2 完成对ESOE项目的介绍 ok 060704 3 在blog发布已有的 ESOE Specification v0 1 doc 英文版 o
  • 什么是.NET架构

    什么是 NET架构 NET架构主要分为3部分 FCL Framework Class Library CTS Common Type System 其中包括Common Language Specification CLR Common L