一、源碼編譯
需要編譯的源碼的代碼倉庫有兩個,一個是 aspnetcore,另外一個是 extensions。
如果有代理,編譯的過程比較簡單,參考微軟的文檔進行編譯即可。
ASP.NET Core:Build ASP.NET Core from Source —— GitHub.NET Extensions:Build .NET Extensions from Source —— GitHub
如果沒有代理,那么整個編譯流程可能非常慢,甚至無法正常進行,可以B站這個視頻執行編譯:編譯並調試 Asp.Net Core 源碼 —— B站視頻
如果使用代理軟件,建議使用 Global(全局)代理,同時命令行與 Powershell 需要設置代理:
# CMD set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0.0.1:7890 # Powershell $Env:http_proxy="http://127.0.0.1:7890";$Env:https_proxy="http://127.0.0.1:7890"
編譯時可能出現的錯誤:C4819 或其他的錯誤。實際代碼是沒有問題的,是編碼的鍋,解決方案:系統編碼設置使用 UTF-8:
系統設置 → 時間和語言 → 語言 → 相關設置 → 管理語言設置 → 管理 → 更改系統區域設置 → 勾選:使用 Unicode UTF-8 提供全球語言支持
設置以后重啟系統即可,網上反饋設置后部分軟件可能出現亂碼,目前我沒發現類似問題。但是,我第一次設置后,系統所有圖標丟失,部分軟件無法正常使用,但是取消選項又重新勾選了一次就正常了,如果像我一樣出現問題,可以多設置幾次試試。
補:發現了一個小問題,登錄穿越火線,頻道名、房間名、游戲玩家昵稱的中文不顯示了。/(ㄒoㄒ)/~~
二、調試
后續需要學習 ASP.NET Core,並深入了解其實現原理,所以肯定希望能夠直接調試源碼。
這里提供兩個調試方案,第一個方案是借助調試工具 dnSpy 來進行調試,第二則是直接使用 Visual Studio 進行調試。
1. dnSpy 反編譯調試
首先需要下載 dnSpy:dnSpy/dnSpy: .NET debugger and assembly editor (github.com),解壓后可以直接打開。
然后我們可以隨意創建一個 ASP.NET Core 的示例項目,打開 Visual Studio Code,創建一個 MVC 項目並編譯。
dotnet new mvc -n 002_Debug
dotnet build
找到生成的 002_Debug.dll 拖到 dnSpy 中,找到程序入口設置斷點並運行,即可進入調試:
2. 源服務器支持
首先如果是使用 Visual Studio Code,設置 launch.json 文件,增加如下內容:
//關閉 “僅我的代碼” 項 "justMyCode": false, "symbolOptions": { //查找並下載symbol文件 "searchMicrosoftSymbolServer": true }
如果時使用 Visual Studio:
選項 → 調試 → 常規 → 取消 “僅我的代碼” 的勾選 → 勾選 “啟用源鏈接支持”
選項 → 調試 → 符號 → 符號文件(.pdb)的位置 → 勾選 “Microsoft 符號服務器”
配置完成后,調試時將會下載符號文件,可以正常調試 ASP.NET Core 的源代碼。
3. 使用源碼調試
首先是 ASP.NET Core,前文我們已經進行了編譯,我們可以在 \artifacts\installers\Debug 找到 aspnetcore-runtime-3.1.9-dev-win-x64.msi 進行安裝。
然后是 .NET Extensions,我們可以在項目中創建一個 NuGet.config,然后配置本地程序包源:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear/> <addkey="local1"value="C:\Users\hd2y\code\extensions\artifacts\packages\Debug\Shipping"/> <addkey="local2"value="C:\Users\hd2y\code\aspnetcore\artifacts\packages\Debug\Shipping"/> <addkey="nuget.org"value="https://api.nuget.org/v3/index.json"protocolVersion="3"/> </packageSources> </configuration>
這時,運行程序進入調試,就可以通過單步調試進入 ASP.NET Core 的源碼。
如果以上操作無法正常調試,可以 F12 查看對應的方法的程序集版本。
例如我的程序集版本是 3.1.10,而我編譯的 ASP.NET Core 的版本是 3.1.9,調試就無法正常進入。
這里有兩種解決方案,第一種是查看 3.1.9 的版本對應的 .NET SDK 的版本進行安裝,然后指定引用程序集的版本:
<ProjectSdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <RootNamespace>_002_Debug</RootNamespace> </PropertyGroup> <ItemGroup> <PackageReferenceInclude="Microsoft.Extensions.Hosting"Version="3.1.9"/> </ItemGroup> </Project>
不指定版本的話,在我測試的時候不知道為什么轉到定義程序集版本是
3.1.8,而不是文檔中提到的3.1.9。
直接指定會使用NuGet.config配置的本地程序包源,如果設置后發現仍舊不行,可能 NuGet 有緩存,需要在 選項 → NuGet 包管理器 → 常規 → 清除所有 NuGet 緩存。
第二種方案是根據當前 .NET SDK 對應的 ASP.NET Core 版本,重新進行編譯,具體版本對應關系可以查看 .NET Core SDK 的下載頁:Download .NET Core 3.1 (Linux, macOS, and Windows) (microsoft.com)
轉自 https://www.hd2y.net/archives/asp-dotnet-core-001-source-code-compilation-and-debugging



