挡不住的好奇心:ASP.NET 5是如何通过XRE实现跨平台的

.NET程序员也有自己的幸福,.NET的跨平台是一种幸福,.NET的开源也是一种幸福,而更幸福的是可以通过开源的.NET了解.NET是如何一步步走向跨平台的,所以幸福是一种过程。

在.NET跨平台的进程中,ASP.NET显然走在了前头,而通过探究ASP.NET 5是如何实现跨平台的,可以稍稍满足一下自己的好奇心。

体验ASP.NET 5跨平台有2种方式:

1)在Mac下,git签出XRE的源代码(前身是KRuntime),然后运行sh build.sh,就能完成整个XRE项目的生成。

2)在Mac下,写一个简单的ASP.NET项目,然后用k kestrel运行,详见不写1行代码,在Mac上体验ASP.NET 5的最简单方法。

这篇博文就从k命令下手,一探ASP.NET 5跨平台的究竟。

运行k kestrel(即将是dotnet kestrel),实际运行的是下面的命令(根据project.json中的commands配置):

k "Microsoft.AspNet.Hosting --server kestrel --server.urls http://localhost:8002"

Microsoft.AspNet.Hosting是一个.NET控制台程序实现的OWIN Host(源码),kestrel是一个基于libuv用.NET实现的OWIN Server(也是Web Server,源码),kestel是由Microsoft.AspNet.Hosting加载的。

既然Microsoft.AspNet.Hosting是一个托管程序,它自己是无法直接运行的。因为运行一个.NET程序的前提条件是CLR已运行,而CLR自己不能运行自己,CLR运行的前提是有一个host程序将它加载。

如果你在Mac下用过Mono,就你就知道运行一个.NET程序需要用mono命令,mono命令的作用就是创建一个进程,加载Mono Runtime(Mono CLR),然后由Mono Runtime执行.NET程序。

而在ASP.NET 5中,并没有直接用mono命令,而是k命令,自从KRuntime改名为XRE之后,k命令也将会被dotnet命令取代。

在非Windows平台下,k命令对应的是k.sh。现在改为XRE之后,也就是donet命令对应dotnet.sh。所以ASP.NET 5跨平台的秘密就藏在dotnet.sh中。

下面就直击XRE项目中的scripts/dotnet.sh:

 

#...
if [ -f "$DIR/mono" ]; then
  exec "$DIR/mono" $MONO_OPTIONS "$DIR/dotnet.mono.managed.dll" "$@"
else
  exec mono $MONO_OPTIONS "$DIR/dotnet.mono.managed.dll" "$@"
fi

 

毫无悬念,依然用的是mono。但是用了mono,如何加载.NET Core CLR,难道还是用Mono Runtime?

带着这个疑问,顺藤摸瓜,看dotnet.mono.managed.dll干了啥。

dotnet.mono.managed.dll的实现代码就在XRE项目中,是一个简单的C#控制台程序,它干了两件事:1)分析命令行参数;2)调用RuntimeBootstrapper.Execute():

 

public class EntryPoint
{
    public static int Main(string[] arguments)
    {
        //...
        arguments = ExpandCommandLineArguments(arguments);
        //...
        return RuntimeBootstrapper.Execute(arguments);
    }
}

 

继续顺藤摸瓜至 [dotnet.hosting.RuntimeBootstrapper],[RuntimeBootstrapper.Execute()] 调用了 [RuntimeBootstrapper.ExecuteAsync()]。

而托管的 [RuntimeBootstrapper.ExecuteAsync()] 竟然拐了个弯,执行了非托管的dotnet命令(一个由dotnet.cpp实现的C++程序)。

mono命令(非托管) -> Mono Runtime -> dotnet.mono.managed(托管) -> RuntimeBootstrapper(托管) -> dotnet命令(非托管),ASP.NET 5 XRE的代码真是十八弯。

千呼万唤始出来,原来真正的主角就藏在十八弯之后。

dotnet.cpp加载了非托管的dotnet.coreclr.dll:

LPCWSTR pwzHostModuleName = L"dotnet.coreclr.dll";
m_hHostModule = ::LoadLibraryExW(pwzHostModuleName, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
pfnCallApplicationMain = (FnCallApplicationMain)::GetProcAddress(m_hHostModule, pszCallApplicationMainName);

而dotnet.coreclr.dll是由XRE中的C++程序dotnet.coreclr.cpp实现的,最终由dotnet.coreclr.cpp加载了coreclr.dll: 

hCoreCLRModule = ::LoadLibraryExW(L"coreclr.dll", NULL, 0);

dotnet.coreclr.cpp就是加载CLR的主角。

这不让人产生疑问,这也可以?仅靠一个C++程序就能加载CLR,执行.NET程序,那我们在Windows上为什么要安装一个庞大的.NET Framework?

真的可以!一个非托管的host程序+CLR,就能运行.NET程序,不信你可以看这篇文章震撼一下:Hosting .NET Core Clr in your own process 。

加载CLR的目的是为了执行.NET程序集中的IL代码,而要执行的程序集是由dotnet命令(前身是k命令)的命令行参数所传递过来的,比如dotnet kestrel(之前是k kestrel),对应的程序集是 Microsoft.AspNet.Hosting。CLR调用 Microsoft.AspNet.Hosting.Program.Main() 方法开始执行,ASP.NET 5就开始干活了。

Core CLR被加载、Microsoft.AspNet.Hosting被运行之后,在 RuntimeBootstrapper.ExecuteAsync() 中,还继续加载了一些dotnet.host的相关程序集(注意:这时不是Core CLR,而是Mono Runtime)。

 

//...
var assembly = Assembly.Load(new AssemblyName("dotnet.host"));
//...
var loaderContainerType = assembly.GetType("dotnet.host.LoaderContainer");
var cachedAssemblyLoaderType = assembly.GetType("dotnet.host.CachedAssemblyLoader");
var pathBasedLoaderType = assembly.GetType("dotnet.host.PathBasedAssemblyLoader");
//...

 

到这里,不知你有没有被这十八弯给绕晕,如果没被绕晕,请继续往下看。

这时一个大大的问号浮现在眼前,既然dotnet命令能直接加载Core CLR,为什么还要用mono命令中转一下?

百思不得其解。。。

在写这篇博文的过程中,突然产生了一个大胆猜想——

在Core CLR被加载,Microsoft.AspNet.Hosting被执行之后,为什么还要用Mono Runtime加载一些dotnet.host相关的程序集?为什么不直接用Core CLR加载呢?这只能用一个原因来解释,dotnet.host依赖的一些程序集在在.NET Framework中有实现,但是在.NET Core Framework中还没有实现,而Mono是.NET Framework的一个跨平台实现,在Mono中也有对应的实现。完整的.NET Core Framework(github.com/dotnet/corefx)还在紧张开发之中,在它出来之前,微软只能借助Mono。这也是ASP.NET的跨平台走在前面要付出的代价,随着.NET Core Framework的完成,XRE的改进,可以预计ASP.NET的跨平台是会脱离Mono的。

当然,这只是一个猜想,如果你知道真相,欢迎来揭开。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索net
, 命令
, 程序
, 跨平台
, mono
, dotnet
, java中使用kestrel
, 程序ubuntulinuxc#mono
, 一个
, 用Net
, Kestrel
用asp.net实现
java如何实现跨平台、java怎么实现跨平台、qt如何实现跨平台、java实现跨平台、html5跨平台开发,以便于您获取更多的相关知识。

时间: 2024-08-01 22:15:09

挡不住的好奇心:ASP.NET 5是如何通过XRE实现跨平台的的相关文章

挡不住的云计算

尽管遭受着"云里雾里"."浮云"."人云亦云"等各种质疑声音,却挡不住云计算快速发展的步伐. 2011年,风起云涌.各地政府相继宣布启动云计算战略,并投入大量资金充当云计算产业的"领头羊":电信.金融.医疗.物流等行业纷纷建设"电信云"."金融云"."医疗云"以及"物流云"等各种形态丰富的混合云,推动云应用落地:IT业界的并购活动持续增多,戴尔收购

“奇葩”创业者:要求VC签署NDA抄袭“挡不住”

注:创业者在创业之前,肯定先要思考自己做什么,这时候点子就产生了.点子重要吗?如果创业者有个很好的点子,是否就能够容易获得投资的机会?有些创业者为了防止别人"抄袭"点子,在谈融资的时候还要求VC签署保密协议,VC又是如何看待这件事的呢?作者孙志超认为,点子对于VC来说,一点都不重要.来看看他的看法吧.今天碰到两个极端反差的创业者.一个创业者要求展示BP细节前先签署NDA,说之前介绍来的天使投资方,找朋友去做一样的事情了.另一个创业者,非常开放地展示自己的想法,虽然很奇葩,但认定第一不会

原生体验挡不住!JavaScript开源跨平台框架NativeScript

原生体验挡不住!JavaScript开源跨平台框架NativeScript NativeScript是一款使用JavaScript语言来构建跨平台原生移动应用的开源框架,支持iOS.Android和Windows Phone.且NativeScript的使用没有过多繁杂的要求,只需使用自己已经掌握的JavaScript和CSS技能就能开发出真正具有原生用户 体验的移动应用. 作 为免费开源项目的NativeScript,它的源码已经托管至Github上,让开发者可以没有任何门槛约束的随意使用.除

移动聊天市场渐成红海 仍挡不住新军涌入

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   硅谷网讯 据国外媒体报道,移动聊天市场渐成红海, 但是仍然挡不住新军涌入,日前以多媒体内容分享以及打通短信为特色的移动聊天工具Invi获得300万美元种子风投,其中香港首富李嘉诚是投资人之一. 此轮投资的投资人包括李嘉诚旗下风投业务维港投资和一直热衷科技行业的明星阿什顿·库切,参与投资的还包括谷歌(微博).诺基亚.雅虎.Groupon.思科等.据报道,维港投资集

大乐透风暴挡不住,头奖九连开3月又迎井喷

http://www.aliyun.com/zixun/aggregation/32729.html">信息时报讯 (记者 胡昌伟) 大乐透风暴挡不住,头奖九连开3月又迎井喷.3月10日晚,大乐透第12027期头奖开出6注615.9万元,分别落于江苏(2注).湖北(2注).江西(1注).新疆(1注)等四个省区,不过幸运儿无一采用追加投注.这也是该玩法连续第9期有头奖开出,总计已送出超值巨奖24注,而在过去11期开奖当中,则已送出500万以上巨奖40注. 重号斜连号又大行其道 3月10日晚,

智冠董事长王俊博称陆资投资台湾游戏业挡也挡不住

7月3日上午消息,据台湾媒体报道,针对台湾开放大陆资本赴台投资,游戏企业台湾智冠董事长王俊博昨日表示,陆资投资台湾游戏业挡也挡不住,一旦成真台湾本土游戏业者如何存活要预先做好准备. 王俊博表示,以智冠多年来在中国大陆代理游戏的经验,大陆游戏企业很凶悍.他表示一定会有大陆游戏企业或资本想投资台湾游戏业,具体会有几家不敢说,"但挡也挡不住." 王俊博认为,中国游戏企业进军台湾的模式不至于在公开市场购买股票,但会在台湾直接设立分公司,并聘请当地人才运营管理.他表示大陆游戏商挖别人墙脚从来不惜

马云:互联网金融与传统金融融合谁也挡不住

阿里巴巴马云 通过模式创新建立了阿里帝国的马云再次出手,这次他锁定的领域是互联网金融.马云提出,在互联网发展的时代背景下,与之融合是传统商业的必然选择.对于未来趋势,拥抱变化者.创新者赢,然后双方一定是走向融合." 马云表示, "就最近一两个月的趋势来看,我相信中国传统金融和互联网金融的融合已经开始.互联网金融与传统金融的融合是谁也挡不住的,这是改革的趋势." 现阶段,业内已经有了一些相应的案例.11月16日,在银泰十五周年大庆第二天,马云现身浙江杭州银泰武林店购物体验,并使

驳李兄《百度玩起电子商务 十个马云也挡不住》

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 李兄<百度玩起电子商务 十个马云也挡不住>的文章,"第一.百度拥有比淘宝更好的硬件与技术." 李兄原文中的小标题 我需要的是具体的数据做支持,而不是泛泛的谈论.当机事件baidu也不少,其中一次好像因为当机一些敏感词解封,baidu变的很黄很强大,什么轮子啊,甚至某些敏感领导人的其七大姨八大姑的鸟事都让baid

互联网创新挡不住:网络不是终点

互联网|网络 又一批新创公司破土而出,谁也捂不住它们创新的芽 创投家们对新一代互联网创业公司们的期待从未如此强烈."目前,互联网新概念的宣传还远远没有达到应有的程度."3月2日,在清华大学主楼的报告厅里,Google的创投人之一.KPCB的创投家约翰·多尔在激昂地演讲. 无数互联网创新意识和创业欲望正在美国硅谷这口巨大的泉眼中喷涌着,并将这股热潮推向整个互联世界. 这当中有机会,也有新泡沫论的担忧.在美国<商业2.0>杂志最近评选出的"25家代表下一代互联网趋势的