当前位置:网站首页>.NET跨平台原理(上篇)
.NET跨平台原理(上篇)
2022-04-23 05:56:00 【begeneral】
1、.NET Framework层次结构
| FCL(Framework Class Library) |
| BCL(Basic Class Library) |
| CLR(Common Language Runtime) |
FCL:这是一个为开发人员提供的API类库,比如我们经常使用的框架:Windows Forms、ASP.NET、WPF、WCF等。这一层是直接面向开发人员的。
BCL:这是处于底层的类库,提供与操作系统层面交互的代码,如:IO、线程管理
CLR:它为程序提供一个托管的执行环境,是.NET Framework的执行引擎。CLR与.NET的关系等同于JVM与Java的关系,CLR本质上就是.NET的虚拟机。
2、CLI
要实现跨平台,必须解决两种类型的差异:编程语言的差异和运行时环境的差异。只有编程语言之间能够实现相互兼容,运行时环境能够得到统一,跨平台方可实现。CLI旨在解决这样一个问题:由不同高级编程语言开发的.NET应用能够在无须任何更改的情况下运行于不同的系统环境中。
CLI全称:Common Language Infrastructure。其中Common Language指的是通用语言,旨在解决各种高级开发语言的兼容性问题。Infrastructure指的是运行时环境,旨在弥补不同平台之间执行方式的差异。
编程语言分为编译型和解释型两类。前者需要通过编译器实施编译以生成可执行代码,CLI涉及的就是编译型语言。要实现真正的跨平台,最终需要解决的是可执行代码在不同平台之间的兼容和可移植问题。如果不同编程语言经过编译后生成的可执行代码是一样的,那么编程语言之间的差异就不再是一个问题了。
2.1、CIL
按照CLI的规定,用来描述可执行代码的是一种被称为CIL(Common Intermediate Language)的语言,这是一种介于高级语言和机器语言之间的中间语言。虽然程序源文件是由不同的编程语言编写,但是我们可以借助相应的编译器将其编译成CIL代码。从原则上讲,设计新的编程语言并将其加入.NET中,只需要以相应的编译器来生成统一的CIL代码即可。我们也可以设计一个编译器,将java代码编译成以CIL为目标语言。这样说的话,其实编程语言只是表象,目标代码(也称可执行代码)才是本质,因为目标代码是直接与计算机打交道的。下面画个图来说明中间语言的作用吧。

编程语言的差异化通过编译器得以统一化,运行环境的差异则可以通过虚拟机(VM)技术来解决。虚拟机是CIL的执行容器,能够在执行CIL代码的过程中采用即时编译的方式将其动态地翻译成与当前执行环境完全匹配的机器指令。虚拟机屏蔽了不同操作系统之间的差异,使目标程序可以不做任何修改就能运行在不同的底层执行环境中。
那按照这个逻辑,.NET应用程序应该可以在非windows平台运行啊,为什么在非windows平台还是无法运行呢?我个人的理解是:微软没有实现非windows平台的虚拟机,也就是CLR。也就是说微软只实现了windows平台的CLR,所以.NET应用程序只能在windows平台执行。
版权声明
本文为[begeneral]所创,转载请带上原文链接,感谢
https://blog.csdn.net/niechaoya/article/details/106938642
边栏推荐
- Vs can be compiled, but there will be a red underline to indicate the problem of undefined identifiers
- Log writing method (with time)
- Understanding of SSH public key and private key
- C# Dapper 基本使用 增删改查事务等
- token详解以及应用原理
- 查漏补缺(二)
- HDU-Memory Control
- 时间戳转格式化日期
- 记第一次使用阿里字体图标库
- .Net Core 下使用 Quartz —— 【4】作业和触发器之作业属性和异常
猜你喜欢

SiteServer CMS5.0使用总结

SignalR实现从服务端主动发送数据到客户端

谈谈v-if显示隐藏问题

Detailed explanation and application of PN junction and diode principle

Overview of node file system and buffer
VHDL arbitrary frequency divider (50% duty cycle)

Node的文件系统及Buffer概述

ASP.NET CORE3.1 Identity注册用户后登录失败的解决方案

【ES6】 Promise相关(事件循环,宏/微任务,promise,await/await)

JS高频面试题
随机推荐
SQLite3 encrypted version
查漏补缺(四)
.Net Core 下使用 Quartz —— 【5】作业和触发器之触发器的通用属性和优先级
NodeJS 模块之间的使用
算数表达式
2020 Jiangsu Collegiate Programming Contest-A.Array
Introduction and application of WMI Technology
C# webpai 路由详解
C language code specification
uniapp 自定义搜索框适配小程序对齐胶囊
获取当前一周的时间范围
el-table添加序号
千呼万唤始出来
ASP.NET CORE在类库项目中读取配置文件
js面试题:fn.call.call.call.call(fn2) 解析
低代码开发平台整理
如何使用input表单向服务发送(占用较小)图片文件(body传输)?涉及到FileReader内置对象
查漏补缺(八)
几款笔记软件的优缺点
ES6面试题(参考文档)