如何编译.Net 6 Runtime源码
起因
.Net源码在整合Mono之后还没有进行过编译后,所以便在自己电脑编译一下.Net源码,记录一下编译过程遇到的事情.#.Net源码地址:
https://github.com/dotnet/runtime
# 编译相关的文档
源码目录/docs/workflow/building/coreclr
下载.Net源码
# 使用git 下载源码到本地
git clone git@github.com:dotnet/runtime.git
如果没有没法访问Github,可以在Gitee上查找有没有最近的.这里就不多说了.
准备工作
在根目录的global.json文件,有需要编译依赖的.Net版本和工具:- dotnet 需要这个版本6.0.100-rc.1.21430.12
- cmake 不低于3.16.4
- python3 不低于3.7.1
开始编译
从Github获取源码后,一定要记得切换分支,因为main分支,现在已经.Net 7 alpha,因为我调试.Net 6源码.所以我将分支切换release/rc-2# main分支已经进入.Net 7 alpha版本
git checkout release/6.0-rc2
#使用build.cmd 编译CoreCLR和BCL库
.\build.cmd -subset clr+libs
执行脚本以后,会在源码的根目录创建.dotnet目录,会先下载一个dotnet-install.ps1文件,主要在该脚本下载dotnet rc1 21430这个版本.下载这个失败.所以在global.json修改.Net 版本. 从.Net官网看到.Net 6 RC1只有一个版本,和global.json中的.Net 版本相差不大,然后修改global.json文件中.Net版本为6.0.100-rc.1.21463.6
#.Net 下载地址
https://dotnet.microsoft.com/download/dotnet/6.0
# 拷贝这个地址
https://download.visualstudio.microsoft.com/download/pr/c50149b6-4e1f-4278-869a-742aa2c7cfe5/bc936112cb6f6215b456c6c1e77d8826/dotnet-sdk-6.0.100-rc.1.21463.6-win-x64.zip
找到xxx(根目录)/.dotnet/dotnet-install.ps1,这里很粗暴的修改下载地址,主要是不懂PowerShell脚本,查找$PayloadURL和$ProductVersionTxtURL这两个变量,将地址改为上面在.Net 官网下载的地址.
#将下载地址替换为可以下载.Net地址
$PayloadURL = "https://download.visualstudio.microsoft.com/download/pr/c50149b6-4e1f-4278-869a-742aa2c7cfe5/bc936112cb6f6215b456c6c1e77d8826/dotnet-sdk-6.0.100-rc.1.21463.6-win-x64.zip";
$ProductVersionTxtURL ="https://download.visualstudio.microsoft.com/download/pr/c50149b6-4e1f-4278-869a-742aa2c7cfe5/bc936112cb6f6215b456c6c1e77d8826/dotnet-sdk-6.0.100-rc.1.21463.6-win-x64.zip"
然后重新开始编译:
.\build.cmd -subset clr+libs
看到上图,代表.Net 源码编译完成,这时候根目录有一个artifacts目录,这里是.Net编译时生成存放的目录.这个目录很大,我这里查不到9个G.
/artifacts/bin/coreclr/windows.x64.Debug 主要是存放CoreRun.exe和其他工具的目录,我将这个目录作为调试目录.
在/artifacts/obj/coreclr/windows.x64.Debug/ide目录中可以找到CoreCLR.sln,用VS打开这个解决方案,这里推荐使用VS2022(虽然还是预览版,但打开项目多的解决方案,真的很快)
找到corerun项目,设置启动项目(不设置也没问题).设置调试参数.
命令为: $(SolutionDir)\..\..\..\..\bin\coreclr\windows.$(Platform).$(Configuration)\corerun.exe
参数为: $(SolutionDir)\..\..\..\..\bin\coreclr\windows.$(Platform).$(Configuration)\NetworkApp.dll(为调试的dll)
工作目录为: $(SolutionDir)\..\..\..\..\bin\coreclr\windows.$(Platform).$(Configuration)
在VS编译发现报错,修改VS 连接器:
还需要将以下动态库,放入CoreRun.exe所在目录
- System.Runtime
- System.Console
- System.Threading
- System.Text.Encoding.Extensions
- System.Runtime.InteropServices
# 生成CoreCLR.sln解决方案
./build.cmd -vs coreclr.sln -a x64 -c Debug