如何查看 .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,一经查实,立即删除!

相关文章

也感山西黑窑洞

也感山西黑窑洞——代腾飞 2007年6月21日 于成都黑窑奴工十年痛屠龙刀下敢不从朗朗乾坤岂纵容敢问苍天谁枭雄转载于:https://www.cnblogs.com/daitengfei/archive/2007/06/22/792794.html

tcl mysql_MySQL·TCL语言

TCL语言就是我们所说的事务控制语言。首先事务的定义就是:一条或者多条SQL语句所组成的一个执行单位,且该组sql语句要么执行要么都不执行。事务有四大特性(ACID),分别为:(1).原子性(A):一个事务是不可再分割的整体&…

[原创]互联网金融App测试介绍

[原创]互联网金融App测试介绍 前端时间非常忙,终于非常忙的时间过去了,抽时间总结下我现在所在公司理财软件App测试,也各位分享下,也欢迎大家提建议,谢谢! 先介绍下我所在公司的产品特点,公司所…

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

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

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

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

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

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

mysql 常用权限_MySQL的权限有哪些

2015-09-04 回答不知道你问的什么意思,mysql中用户的权如下:select_priv。确定用户是否可以通过select命令选择数据。insert_priv。确定用户是否可以通过insert命令插入数据。update_priv。确定用户是否可以通过update命令修改现有数据。delete_priv。确…

给定两个二叉树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;”…

java导出mysql数据库失败_利用Java进行MySql数据库的导入和导出

利用Java来进行Mysql数据库的导入和导出的总体思想是通过Java来调用命令窗口执行相应的命令。MySql导出数据库的命令如下&#xff1a;mysqldump -uusername -ppassword -hhost -Pport exportDatabaseName > exportPath利用Java调用命令窗口执行命令来进行MySql导入数据库一般…

使用timer控件创建一个简单的报警程序

简介&#xff1a;当我使用计算机工作时&#xff0c;我总是如此的专心致志&#xff0c;以至于每当我过了“一会儿”去看时间时&#xff0c;发现已经过了三个小时&#xff0c;而我却完全没有意识到&#xff01;所以我决定使用我从Code Project学来的C#技术&#xff0c;来创建一个…

jstl格式化日期

<% page contentType"text/html" pageEncoding"GBK"%> <% page import"java.util.*"%> <% taglib prefix"fmt" uri"http://java.sun.com/jsp/jstl/fmt"%> <html><head><title>国际化标…

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

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

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

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

二、穷举搜索法

穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验&#xff0c;并从众找出那些符合要求的候选解作为问题的解。 【问题】 将A、B、C、D、E、F这六个变量排成如图所示的三角形&#xff0c;这六个变量分别取[1&#xff0c;6]上的整数&#xff0c;且均不相同。求…

恢复Ext3下被删除的文件

下面是这个教程将教你如何在Ext3的文件系统中恢复被rm掉的文件。假设我们有一个文件名叫 ‘test.txt’$ls -il test.txt15 -rw-rw-r– 2 root root 20 Apr 17 12:08 test.txt注意&#xff1a;: “-il” 选项表示显示文件的i-node号&#xff08;15&#xff09;&#xff0c;如果你…

WPF 表格控件 ReoGrid 的简单使用

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

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

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

mysql主主同步冲突_MySQL主主同步主键冲突处理

两台数据库都报slave同步失败了&#xff0c;先说明一下环境&#xff0c;架构&#xff1a;lvskeepalivedamoebamysql&#xff0c;主主复制&#xff0c;单台写入&#xff0c;主1:192.168.0.223(写)主2:192.168.0.230好吧&#xff0c;先show slave status \G看一下同步失败的具体报…