【dotnet】dotnet和mono及跨平台实现原理及案例(重要)

跨平台语言运行原理

在任何一个平台(操作系统+硬件体系)上,编写和运行程序的三个最根本的需求是库、编译器/解释器(如将c#编译为IL即DLL或者java编译为class字节码)、运行环境(如CLR或者JVM)。库以类和方法(函数)的形式提供常用的例程,简化大型程序的编写。.NET框架也不例外,包含了许多类库。另外,把程序转换成可执行形式以及运行执行文件时,编译器和运行环境是必不可少的。

简而言之跨平台就需要你语言在编译后的中间结果后,在任意目标平台上实现可以运行这个中间结果的程序即可。

.net相关历史介绍

2002年微软发布的.net framework(至今更新到4.8),只针对window平台,其主要包含管理代码执行的 CLR (公共语言运行时)和为构建应用程序提供丰富类库的 BCL (基础类库)

2016年微软发布.net core,完全开源,实现了跨平台,.net core因此需要针对不同平台打包CLR(通用语言运行时), 其包含 CLR 的跨平台实现 CoreCLR 和一个相比 BCL简化的类库 CoreFX,最新是.net core 3.1之后被更名为.net5

2020年微软发布.net5.0,整合了.net core,实现大一统

mono

Mono 是一个第三方的 .NET Framework 开源实现,它是跨平台的,但是它的实现进度远远落后于官方实现。

类库:包含了.NET类库的一部分,落后给官方实现
编译器:高级语言转为IL 的⼯作实际上可以直接⽤微软已有的成果,这个是通用的,肯定落后官方
运行时:Mono是将 CLR 在其他平台实现,就是跨平台,这个⼯作量不仅⼤,⽽且需要保证兼容,⾮常浩⼤的⼀个⼯程,Mono 做到了,致敬!

dotnet5.0+跨平台实现demo

c#demo

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!输入Q退出。");
            while (true)
            {
                string str = Console.ReadLine();
                if (str.ToLower() == "q")
                {
                    break;
                }
                else
                {
                    Console.WriteLine("输入Q退出。");
                }
            }
        }
    }
}

linux上安装.net5以上版本后运行这个程序

root@debiantest1:/data/demo1# dotnet ConsoleApp1.dll
Hello World!输入Q退出。

参考 https://www.cnblogs.com/zhupengfei/p/16086032.html

后续同样使用mono linux平台的CLR也可以运行dll、exe程序

备注一些补充概念

1.IL/CIL

编译器编译 : 使用C#书写的脚本会经过Mono或者.net平台的C#编译器打包的中间语言,实际就是exe或者dll文件(重要)

2.CLR

用于运行IL的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值