让mono运行Asp.Net Core项目

起因

其实.Net Framework支持Asp.Net Core项目的,支持最高到Asp.Net Core 2.2,为什么.Net Framework支持Asp.Net Core项目呢?这个就像是先有鸡还是先有蛋的缘故。这个得说一下Asp.Net Core 和 .Net Core的关系,最初是先有Asp.Net Core项目,这会是Asp.Net Core运行.Net Framework运行时的,直到.Net Core出来后,慢慢的Asp.Net Core团队才放弃在.Net Framework运行Asp.Net Core.

先看看.Net Framework、Mono、.Net Core对各种体系CPU的支持

Mono和.Net Core支持的cpu架构对比
上图是分别从Mono(github)和 .Net Core(github)现有支持的。Mono一部分cpu体系是有社区支持的。
在对比CPU支持,发现.Net Framework支持是最少的,只支持X86,其次是.Net Core,支持最多的是Mono。
在信息国产化和软件国产化的前提下。使用Mono将老的项目迁移到Linux下,是个很不错的选择。如果是龙芯的话只能用Mono了,龙芯的cpu是基于mips的,在mips原有的指令集上,又扩展了指令。龙芯的人对Mono的支持并不热衷。不过对.Net Core倒是很热情的。从github看到的 16年说支持的,后来就没后来的。

其他的国产CPU(如飞腾)大多数基于ARM扩展的.使用Mono和.Net Core都是可以的。
印象中还有神威(超算),是基于alpha,这个Mono也不支持的。

Asp.Net Core 2.2及小于2.2的版本

1.创建.Net Core web项目
创建.Net Core Web项目,选择.Net Framework 运行时

2.设置发布的选项
设置项目发布文件路径
3.看看发布的目标框架是否为.Net Framework 4.6.1,
设置发布的目标框架为net461
4.在发布的文件夹内,找到和程序同名的exe文件,Windows下双击运行,Linux下可用 mono aaa.exe
执行和项目同名的可执行程序
5.运行程序
运行程序,看能否运行程序
6.在浏览器中访问程序
查看程序运行后的效果
Linux上要安装mono或者jexus(新版本有jwss 可以执行exe)

如果先运行更高的版本,只能使用Mono

Mono可以支持Asp.Net Core 3.0的项目,从GitHub上看Mono源码,分别使用到mono-sgen.dll(Windows下dll,Linux下so,Mac下dylib)和coreclr.dll以及System.Private.CoreLib.dll(这个动态库是区别于.Net Core的同名动态库),在mono/netcore/src/LinkerDescriptor/System.Private.CoreLib.xml文件中看到一些映射类型关系,推测该库是Mono运行.Net Core的映射.虽然目前没有运行成功,等着月底Mono 6.6的发布吧!
秋风 2019-11-12