如何查看 .NET Core 3.1 源代码

背景

在 .NET 走向开源后,我们可以方便的查看 .NET 内部的实现方式,学习和寻找问题,甚至参与到 .NET 的开发中。

前段时间,同事需要查看 C# 的 Task 类 (System.Threading.Tasks) 的一些实现和内部的原理,想找 Task 类的源代码来查看,却遇到了一些阻碍……

本文借此机会介绍两种方式来查看 .NET Core 3.1 的源代码:

  • 直接查看 .NET Core 源代码

  • 通过反编译来查看实现

本文同样适用于 .NET Core 3.1 之前的 .NET Core 版本;.NET 5 及之后的版本查看源代码的方式有所改变,会在下文相关部分简单提及。选择 3.1 版本是因为当前 .NET Core 最新的 LTS 版本为 3.1,绝大多数公司都会选择使用 LTS 的版本进行开发。所以本文并未过时,还能有用一段时间????

直接查看 .NET Core 源代码

概念回顾

对于经历过 .NET Framework 时期的巨佬们一定接触过 CLR 和 FCL 这两个概念:

  • CLR(Common Language Runtime,公共语言运行时 https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-4.0/8bs2ecf4(v=vs.100) )负责内存管理、垃圾收集、JIT 编译等。

  • FCL(.NET Framework Class Library,.NET Framework 类库 https://docs.microsoft.com/zh-cn/previous-versions/gg145045(v=vs.110)?redirectedfrom=MSDN )是进行 .NET Framework 开发的标准类库,提供了最基本的功能。例如 System 命名空间下的基本类和基类、System.Drawing 命名空间下提供的图形处理功能 、System.Linq 命名空间下提供的 LINQ 扩展方法等。

进入 .NET Core 时代,大家一定见过这张图:

可以看到 .NET Core 一列,Base Libraries 一行中出现了 CoreFX Class Library ( https://docs.microsoft.com/zh-cn/dotnet/standard/glossary#bcl ),它的左边便是 FCL。我们可以理解 CoreFX 就是 .NET Core 的 FCL。而 .NET Core 的 CLR 则被称为 CoreCLR( https://docs.microsoft.com/zh-cn/dotnet/standard/glossary#core-clr )。

获取源代码

要想获得 .NET Core 3.1 的源代码,我们主要关注这两个 Github repo:

  • /dotnet/coreclr ( https://github.com/dotnet/coreclr )

  • /dotnet/corefx ( https://github.com/dotnet/corefx )

注意,刚 clone 到本地时可能看不到源代码,因为默认的 archive 分支只有一篇迁移 repo 的公告,需要将分支切换到想看的版本上才能查看到代码。通过 tag 命令筛选要查看的 .NET Core Runtime 版本:

git tag -l 'v3.1.*'

并通过 checkout 命令切换到对应版本的代码上,例如我想查看 3.1.16 版本的 .NET Core Runtime 对应的实现:

git checkout v3.1.16

我们要找的代码大都位于 src 文件夹下。

理解 CoreCLR 和 CoreFX

结合前面回顾过的概念,我们应该可以明白这两个 repo 的作用。但实际上,这里必须得提及 System.Private.CoreLib.dll 的概念,可以帮助我们理解为什么既需要 CoreCLR 又需要 CoreFX 的源代码,它俩的区别是什么( https://github.com/dotnet/coreclr/tree/v3.1.16#relationship-with-the-corefx-repository ):

CoreCLR 的设计理念是,尽可能少的包含类,只把 CLR 内部工作需要的类(例如 System.ObjectSystem.StringSystem.Threading.ThreadSystem.Threading.Tasks.Task 和大多数基本接口)包含在 CoreCLR 源代码中,并通过 System.Private.CoreLib.dll 提供给 CoreFX。

CoreFX 中虽然也有 System.Object 的声明,并最终生成 System.Runtime.dll,但其定义属于一种外观(facade),当我们使用到 System.Object 时,引用会被转发到 System.Private.CoreLib.dll 中。

也就是说,如果我们想要查看一些基本类(例如 System.StringSystem.Threading.Tasks.Task),就需要到 CoreCLR 的源代码中寻找,而其它的一些类和方法的实现(例如 LINQ 里的扩展方法是如何工作的)则需要到 CoreFX 源代码中查看。

如何区分代码位于 CoreCLR 还是 CoreFX

使用 .NET Source Browser

可以参考 .NET Source Browser 工具。它可以在线查看当前最高版本的 .NET 源码(仅限最高版本,目前也就是 6.0 preview)。

在左上角的搜索框里输入要查看的类或方法名,如果你需要的内容出现在 System.Private.CoreLib 中,那就需要到 CoreCLR 中查看,否则到 CoreFX 查看。但由于查询的是最高版本的 .NET 源码,结果仅供参考。


使用 Visual Studio

直接上源代码里搜索应该是更常用的方案,先自行判断一下是不是基础类,如果是则优先上 CoreCLR 中查找。使用 Visual Studio 的 转到 ( https://docs.microsoft.com/zh-cn/visualstudio/ide/go-to?view=vs-2019 ) 功能可以轻松查找各种类、方法等内容。默认快捷键为 Ctrl + T。

由于源代码里大量使用了partial(部分类)( https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods ),而且不同平台(Windows/Linux)实现可能不同,导致一个类或方法会在多个地方实现,请注意甄别,搜索时用最小单位来搜索,以免大海捞针。

.NET Core 3.1 和 .NET 5 的不同

.NET 5 将 .NET Core 相关的几个 repo 合并成为一个名为 /dotnet/runtime ( https://github.com/dotnet/runtime )的 repo(不止 CoreCLR 和 CoreFX 这两个,可以参阅 Consolidating .NET GitHub repos  ( https://github.com/dotnet/announcements/issues/119 ) 了解)。

虽然合并了,但也差不多,在 /src/coreclr/src/System.Private.CoreLib 文件夹下可以找到 System.Private.CoreLib 相关的代码;而 /src/libraries 中则是原来 CoreFX 的实现。

访问不了 Github 怎么办

由于众所周知的原因,正常访问 Github 变得困难,如果你尝试了很多办法后仍然无法稳定的访问或下载代码,最简单的方法就是注册一个 gitee 账号,并使用 gitee 的导入 GitHub 仓库功能。

请一定使用“从 URL 导入”,上述 GitHub repo 的 URL(后面加不加 .git 都没问题)就是 gitee 导入时需要填写的 GitHub repo url。导入后会在你的账户下生成对应的 repo。

或者干脆都不用注册 gitee,直接用 gitee 提供的“Gitee 极速下载”( https://gitee.com/organizations/mirrors/projects )服务,在里面搜索 CoreCLR 和 CoreFX。

小试牛刀

至此,我们已经获取到 .NET Core 的源代码,并了解了如何进行查看。下面大家可以试一试看看自己一直想查看的 .NET 内部实现吧。

通过反编译来查看实现

隆重向大家推荐 ILSpy  ( https://github.com/icsharpcode/ILSpy ),这是一款开源免费的 .NET 反编译工具,非常好用,是一款能陪伴你走完职业生涯的软件。

获取 ILSpy

可以直接在 Github 的 Release 页面上下载它的 zip 包,解压后可以直接使用,但没有与 Visual Studio 集成。

这里主要介绍它在 Visual Studio 中的应用,有几种方便的办法将它与 Visual Studio 集成:

  • 在 Github 的 Release 页面下载 vsix 包

  • 如果访问不了 Github 可以尝试 Visual Studio 扩展(扩展 - 管理扩展)中搜索并安装 ILSpy

  • 如果 Visual Studio 扩展下载依然很慢,可以直接通过 Visual Studio Marketplace 下载 ( https://marketplace.visualstudio.com/items?itemName=SharpDevelopTeam.ILSpy )

安装完成后,鼠标右键点击要查看实现的代码,会显示出“用 ILSpy 打开代码”的菜单:

在弹出的 ILSpy 窗口中查看反编译出来的代码:

需要注意的是,这种办法适合只需要看一看的情况,而且反编译得到的代码和源代码不是完全相同的(但执行的结果肯定是一致的)。

总结

之前同事遇到的问题就是,一开始只 clone 了 CoreFX,而 Task 类实际上是在 CoreCLR 的 System.Private.CoreLib 中定义的~ 在 CoreFX 自然查看不到实现代码了。

通过本文的介绍,相信大家一定能快速的查看 .NET Core 的源代码了:

  • 直接获取源代码:适用于想要学习了解 .NET 源码、组织方式、调试或致力于参与到 .NET 建设的情况

  • 通过 ILSpy 反编译:适用于临时看看某些代码的实现的情况

参考

  • Understanding .NET (2nd Edition)

  • .NET Core, .NET Framework, Xamarin – The “WHAT and WHEN to use it” ( https://devblogs.microsoft.com/cesardelatorre/net-core-1-0-net-framework-xamarin-the-whatand-when-to-use-it/ )

  • CoreCLR is now Open Source (https://devblogs.microsoft.com/dotnet/coreclr-is-now-open-source/ )

  • .NET 术语表 ( https://docs.microsoft.com/zh-cn/dotnet/standard/glossary )

希望这篇文章能对您有帮助

可以的话,别忘了“喜欢作者”哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

装×失败的后果。。。 | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅传说中的“虎口夺食”摄像头留下了垃圾桶欺负我的证据用力过猛扯淡还是扯底裤装失败二进洗脚盆玻璃太干净了,注意左边这个傻子哎呀,这个傻子真的是傻中奖的感觉还是要量力而行滑的还真溜。。。电动车此刻注入了灵…

.net core 下的HttpClient、WebClient性能测试

有许多服务需要拉取api接口数据,因此后端开发少不了对Http访问请求进行封装,最主要的应用方式莫过于采用WebClient进行封装,简单易用;而.net core微软官方推荐的是HttpClient和HttpClientFactory,到底哪个性能更加强劲…

北京一公交车发生爆炸 疑为乘客携带药品起反应

勘察人员从公交车里取出可疑爆炸物。薛珺摄点击查看其它图片昨日下午,一辆850路公交车行驶在阜成路时发生爆炸。5名乘客经检查均无大碍。   警方怀疑是乘客所携类似血清的药品引发化学反应所致。   事故现场在八里庄桥上,昨日下午5时许,一…

给定两个二叉树T和S,判断S是否为T的子树

2019独角兽企业重金招聘Python工程师标准>>> #include<iostream> #include <stdlib.h> using namespace std; struct node{int data;node* leftchild;node* rightchild; };bool isSubtree(node* root1,node* root2){if(root2NULL)return true;if(root1N…

ABP Framework 为什么好上手,不好深入?探讨最佳学习姿势!

离写上一篇经验总结 ABP Framework 研习社经验总结&#xff08;6.28-7.2&#xff09;&#xff0c;已经过去两周。ABP Framework 研习社&#xff08;QQ群&#xff1a;726299208&#xff09; 最近两周&#xff0c;又迎来了很多新伙伴&#xff0c;成员数量上升至300。从大家的关注…

见识过世界的强大,才能拥有掌握世界的力量

▲ 点击查看在假期的时候&#xff0c;很多家长会选择带孩子一起出去旅游玩耍。在这个过程当中&#xff0c;家长们可能经常都会被孩子各种稀奇古怪的问题给包围住。“这个车为什么能跑的那么快&#xff1f;“这棵树是什么树&#xff0c;为什么它长得比其他树要高&#xff1f;”…

FastTunnel - 打造人人都能搭建的内网穿透工具

FastTunnel是用.net core开发的一款跨平台内网穿透工具&#xff0c;它可以实现将内网服务暴露到公网供自己或任何人访问。与其他穿透工具不同的是&#xff1a;FastTunnel项目致力于打造一个易于扩展、易于维护的内网穿透框架&#xff0c;任何人都可以基于该框架二次开发&#x…

一招搞定高等数学! | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅瓜皮儿十三妹没品图一张图让你们看看鲨鱼的血液循环系统到底有多复杂普外科曾医生小猪佩奇其实是“巨猪佩奇”小猪佩奇真实身高为7.1英尺也就是2.16米但她在家还不是最高的一只浪鸭水陆两栖的自行车它出现在1932年的巴黎街头因为加装了…

WPF 表格控件 ReoGrid 的简单使用

WPF 表格控件 ReoGrid 的简单使用目录一、概述二、安装三、添加控件四、加载 Excel五、属性设置六、支持触摸滚动七、其它操作1、显示和隐藏列2、显示特定字体八、资源链接独立观察员 2021 年 7 月 9 日一、概述ReoGrid 是一个开源的表格控件库&#xff0c;支持 Winform 和 WPF…

史上最牛空姐,从飞机上掉下愣是没摔死

全世界只有3.14 % 的人关注了青少年数学之旅珠穆朗玛峰最新的测量高度为8844米&#xff0c;人是血肉之躯&#xff0c;一旦从这么高的地方掉下来&#xff0c;别说生还了&#xff0c;能有个全尸就不错了。但是&#xff0c;历史上却有这么以为超级幸运的女人&#xff0c;她从比珠穆…

nginx对websocket的支持及uliweb chatroom的测试

2019独角兽企业重金招聘Python工程师标准>>> 在尝试在uliweb中使用gevent开发聊天室时&#xff0c;已经在网上搜到nginx是支持websocket的代理的&#xff0c;不过应该不支持集群模式。不过当时没有试过&#xff0c;今天试了一下&#xff0c;在普通的反向代理是没有问…

为什么祖国没有农历生日? | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅假期计划路线所以为什么没有农历生日所以这个到底是什么字&#xff1f;身体不适&#xff0c;去了趟医院那医生怎么说&#xff1f;......你还敢说养我吗&#xff1f;&#xff08;图源网络&#xff0c;侵权删&#xff09;

ios中amplify配置configure_Nginx源码编译安装及配置文件初步学习

通过源码编译安装。nginx.org #官网地址 # 安装过程 wget http://nginx.org/download/nginx-1.18.0.tar.gz -P /usr/src # tar文件用tar命令解压 tar -zxvf nginx-1.18.0.tar.gz关于wget的-P参数&#xff0c;manual中的解释是prefix&#xff0c;Set directory prefix …

演示: 动态NAT完成网络地址翻译

演示&#xff1a; 动态NAT完成网络地址翻译技术交流与答疑请加入群&#xff1a;1952289演示目标&#xff1a;使用动态NAT完成对私有网络的地址翻译。演示环境&#xff1a;如下图9.63所示。演示背景&#xff1a;该演示环境保持PAT演示环境的网络基础配置&#xff0c;然后使用动态…

.NET测试用例写的好不好?让变种来测试一下!

为了保证代码能够正常工作&#xff0c;我们常常编写了大量单元测试&#xff0c;并且代码覆盖率也做到了100%。但是在生产环境运行时还是会出问题&#xff01;为什么&#xff1f; 这是因为你没有进行变异测试&#xff01;变异测试变异测试就是把bug&#xff08;变种mutant&#…

你根本想象不到,学霸到底经历过什么

全世界只有3.14 % 的人关注了青少年数学之旅在微信的订阅号中&#xff0c;每人最多有12个常读公众号。可公众号这么多&#xff0c;哪些公众号值得关注呢&#xff1f;今天给大家推荐的几个公众号&#xff0c;不仅生产优质的时效性内容&#xff0c;还会提供各种多元化的内容角度&…

买基金如何开户

开户主要有两种途径&#xff1a;&#xff08;1&#xff09;投资者通过深交所交易系统认购、买入或卖出上市开放式基金须使用深圳A股账户或深圳证券投资基金账户&#xff08;以下简称“深圳证券账户”&#xff09;。投资者可通过中国结算公司深圳分公司的开户代理机构&#xff0…

历史上最怪异的23种飞行器,设计者脑子里都想什么了

全世界只有3.14 % 的人关注了青少年数学之旅历史的长河中有无数稀奇古怪&#xff08;呆萌&#xff09;的发明被无情淘汰&#xff0c;而飞行器的发明可谓人类探索道路上尤为浓烈的一笔&#xff0c;过去的110多年里&#xff0c;空中就曾出现以下23中古怪的飞行器。下面这张图比较…

NET问答: 如何让 HttpClient 支持 Http 2.0 协议?

咨询区 Justin Lessard&#xff1a;我的一个项目需要支持 Http 2.0 进行数据的收发&#xff0c;目前用的项目版本是 .NET Core 2.2&#xff0c;我选型了 HttpClient&#xff0c;但是我发现一个问题&#xff0c;在生产环境中的程序返回的 response 版本一直都是 Http 1.1&#x…

邮件发送类,支持Gmail

邮件发送类,支持Gmail&#xff0c;使用简单方便 usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Net.Mail;namespaceLZ2007.Function...{ /**//// <summary> /// 邮件发送类 /// <CreateDate>2007/07/02<…