像JAVA一樣流暢調試C#源代碼?

起因

最近在研究ServiceScope的內一些內在運行邏輯,發現相關資料非常少,只有講IOC相關的文章有說Core時代的官方依賴注入怎么使用。。遂決定還是要去看源代碼。這部分源代碼在Microsoft.Extensions.DependencyInjection庫中,源代碼位置在src/libraries[1]下。閱讀了一點,發現內部解析服務的時候會來回倒騰,那看代碼的方式去梳理就非常難受了。。

有沒有一種可能, C#也能像JAVA那樣非常順暢的調試源代碼呢?

效果

還真有!?話不說多,看圖:

d1f56787ce2c3371860b8de462f492d9.png7cd18db4a253833ac016b03ef37e6193.png

速度非常快,像調試本地代碼一樣.. 比反編譯出來的流暢度不知道高到那里去了!

不知道官方的項目用了什么黑魔法,這里能直接拉到源代碼(圖里的外部源),而自己開發的項目做不到這一點。

具體步驟

這塊其實官方有說明,但漏了幾個關鍵點導致我卡了非常久,下面會進行詳細說明:

  • PS1:以Windows VS為主,其它平臺應該類似

  • PS2: 我主要是查看DI的構建邏輯,這塊在不同版本差異不大, 所以我直接獲取了6.0

1.打開官方倉庫

官方倉庫[2]

然后你拉取你想看的分支代碼到本地,我主要是看

7a0633d7332b97b6358b1027043d278e.png

2.找到他們的構建說明

5307eb418e713951f290298787610c3b.png

3.安裝對應平臺的基礎環境

cea8e66892fad5bdbc9a7b6479d1dfad.png

Windows VS平臺是這樣安裝的:

55cdbc1545ec69c844f797de9821f8b8.pngeb7d1d1b0d4454aea3fa8c20a5686163.png

然后點擊查看詳細信息,彈出的提示(無法安裝XXXXX)可以忽略, 然后點修改即可。

這一步,官方的說法是你只需要安裝更高版本的SDK即可,不用一一匹配。通常情況下開發的電腦上都會安裝.NET Framework和.NET的幾個SDK,一般都有。我自己是安裝 .NET Framework 4.0目標包+4.7.2、目標包+NET 6.0的SDK。

[重點]4. 還原對應庫

資源瀏覽器定位到runtime的根目錄,記住這個build.cmd

5c6cc3fe7407bca063b8947096531b56.png

右鍵打開命令行或pwd,像這樣執行:

1f41f317388989bc8c11d644a68c50f4.png

腳本會下載一個ps1文件然后自動執行,我們等待即可,他會自動還原我們需要的庫,并且把依賴的基礎包也一并還原好。

官方的代碼結構中已經做好了nuget配置和輸出目錄, 我們已經不需要額外配置了,下一步進行編譯。

5.生成對應庫的dll文件

打開對應庫的代碼文件:

d39292340dacd8460a5cd87abefd5138.png

右鍵打開命令行或pwd,像這樣執行:

13bfff6d5cf175ff1e40c2d42fa69f15.png

等待編譯結束去這個目錄下找東西

b58dcea45257bd28c79c10fd50744efd.png

每個庫都會生成到artifacts下面,然后不同架構對應一個文件夾, 此時你就可以在你的測試項目中直接引用這個dll了, 愉快的調試吧。

[可選]6.生成依賴庫文件

我這里是想調試Microsoft.Extensions.DependencyInjection,在Nuget上就能看到他還依賴一個抽象定義包Microsoft.Extensions.DependencyInjection.Abstractions,為了不在調試中卡殼,我把這個包一并如法炮制。

其它

  1. 在查閱資料時發現其實也可以用VS直接編譯,但需要配置些東西,我沒看明白就用這個辦法了,我也不需要編譯所有的。

  2. VS Code也可以,但我主要用VS就略過這部分了

  3. build.cmd腳本不加參數似乎是編譯所有包, 我不需要就跳過這個了

參考資料

  1. 官方構建文檔[3]

  2. 關鍵構建流程[4]

參考資料

[1]

src/libraries: https://github.com/dotnet/runtime/tree/release/6.0/src/libraries/Microsoft.Extensions.DependencyInjection

[2]

官方倉庫: https://github.com/dotnet/runtime

[3]

官方構建文檔: https://github.com/dotnet/runtime/blob/main/docs/workflow/requirements/windows-requirements.md

[4]

關鍵構建流程: https://github.com/dotnet/runtime/blob/main/docs/workflow/README.md

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285411.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

物化視圖VS普通視圖

2019獨角獸企業重金招聘Python工程師標準>>> 物化視圖是一種特殊的物理表,“物化”(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表,應用的局限性大,任何對視圖的查詢,Oracle都實際上轉換為視圖SQL語句的查…

【CASS精品教程】CASS繪圖軟件入門初級教程超詳細資料

文章目錄 第一章 CASS 9.0簡介第二章 CASS 9.0快速入門第三章 測制地形圖第四章 測制地籍圖第五章 土地詳查與勘測定界第六章 CASS在數據入庫中的應用第七章 CASS 9.0在工程中的應用第八章 數字地圖管理第九章 CASS在市政監管中的應用第十章 白紙圖數字化第十一章電子平板成圖第…

多兼容的JS獲取鼠標坐標

//第一、相對于屏幕 function getMousePos(event) {var e event || window.event;return {x:e.screenX,y:screenY} } //第二、相對于瀏覽器 function getMousePos(event) {var e event || window.event;return {x:e.clientX,y:clientY} }//第三、相對于文檔 function getM…

aws-ec2-雙網卡問題

問題描述 在已存在的EC2上新添加網卡后發現,凡是和eth0在同一個網段的只能通過eth0訪問,不能通過eth1。同樣的,在eth1網段的只能通過eth1訪問,不能通過eth0訪問。 如果既不在eth0也不再eth0 默認走eth0(在沒有修改路由表的前提下&…

EditPlust 批量添加自定義工具

先將插件文件***.js文件放到指定目錄,比如editplus的安裝下新文件夾tools。 (下載地址見文末) 將下列代碼內容另存為tool_u.ini 文件(不能改名), 放到EditPlus 的ini文件目錄 (工具-設置目錄 可…

iOS c語言 基本運算符

2019獨角獸企業重金招聘Python工程師標準>>> iOS_06_基本運算符 一、算術運算 c語言一共有34種運算符,包括了常見的加減乘除 1.加法運算 # 除了能做加法運算,還能表示正號:5、90 2.減法運算- # 除了能做減法運算,還能表…

【CASS精品教程】CASS快捷鍵大全吐血整理

A——畫弧(ARC) AA——給實體加地物名 B——自由連接 C——畫圓(CIRCLE) COPYCLIP——從不同窗口復制局部 CP——拷貝(COPY) D——繪制電力線 DD——通用繪圖命令 DDPTYPE——改變點形狀 E——刪除(ERASE) F——圖形復制 FF——繪制多點房屋 G——繪制高程點 H——線型…

Maui學習之路(三)--Winui3深入探討

Maui的學習之路 --- Winui3深入探討學習Maui已經有一段時間,隨著不斷地深入,對Maui有了一些初步的了解。我們都知道Maui為了保持平臺原生特性,所以在每一個平臺都使用了平臺自身的原生開發框架,如在Windows系統使用了Winui3作為UI…

centos 7.1 apache 源碼編譯安裝

Apache編譯安裝 一,需要軟件: http://mirrors.cnnic.cn/apache//apr/apr-1.5.2.tar.gz 1.apr-1.5.2.tar.gz http://mirrors.cnnic.cn/apache//apr/apr-util-1.5.4.tar.gz 2.apr-util-1.5.4.tar.gz http://exim.mirror.fr/pcre/pcre-8.38.tar.gz 3.pcre-8…

【ArcGIS風暴】ArcGIS平臺上點云(.las)數據生成等高線方法案例精解

las是點云數據常見的存儲格式,攝影測量和激光雷達數據均采用此格式,點云數據常用來生成等高線,地籍測量,土方量計算等。本文講解在ArcGIS平臺上生成等高線并轉換為dwg格式供CASS使用。 擴展閱讀: 什么是點云?什么是Las數據集?一篇文章告訴你點云數據的奧秘 ArcGIS+CASS點…

通過兩級網關設計來路由服務網格流量

編者的話本文是來自筆者的公司 Tetrate[1] 工程師 Petr McAllister 的分享,Tetrate 的拳頭產品是 Tetrate Service Bridge[2](下文簡稱 TSB),它是在開源的 Istio 和 Envoy 基礎上構建的,但為其增加了管理平面。簡介Tet…

各個線程順序循環執行

問題描述:A任務執行完之后執行B任務,B任務執行之后再執行C任務,C任務執行完之后A再執行任務,以此循環下去 Task 1 package com.ydd.work.concurrent;2 3 import java.util.concurrent.atomic.AtomicInteger;4 /**5 * 6 * author…

python類相關

class A:def bar(self):print("BAR")self.f1() class B(A):def f1(self):print("B") class C:def f1(self):print("C") class D(C,B):pass obj D() obj.bar() # 創建了類A、B、C、D; # D繼承了C和B,B繼承了A,…

Python File 介紹

Open() 方法 Python open() 方法用于打開一個文件,并返回文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSError。 注意:使用 open() 方法一定要保證關閉文件對象,即調用…

H5開發中常用的js方法

2019獨角獸企業重金招聘Python工程師標準>>> h5和app之間的webview交互 這是常用的交互方法之一,iOS可以使用WKWebView,安卓可以使用JsBridge,完成常見的交互效果。function webViewHandler(iosCallback, adrCallback) {if (getMobileOperatingSystem() …

【前端優化】

如何進行前端優化 (1) 減少http 請求次數:css spirit(多張小圖放一個大圖上,用定位選擇不同小圖),data uri(壓縮圖片大小), 圖片大小控制合適;網頁Gzip&#…

GPS RTK(銀河1)基準站架設、移動站設置完整操作流程

本文講解GPS RTK(銀河1)基站架設完整操作流程,包括相對坐標、點校正等操作。 文章目錄 一、架設基準站二、啟動基準站三、架設移動站四、設置移動站一、架設基準站 基準站一定要架設在視野比較開闊,周圍環境比較空曠的地方,地勢比較高的地方;避免架在高壓輸變電設備附近…

在.NET 6.0上使用Kestrel配置和自定義HTTPS

本章是《定制ASP NET 6.0框架系列文章》的第四篇。在本章,我們將學習ASP.NET Core的Kestrel配置和自定義HTTPS,好我們開始正文。在ASP.NET Core中,默認情況下HTTPS處于打開狀態,這個不是問題,我們無需禁用它。因為如果…

dom4j-2.1.1 jaxen-1.1.6 讀取xml數據源

<?xml version"1.0" encoding"UTF-8"?> <data><row><id>1</id><name>JackieChen</name></row><row><id>2</id><name>TomLee</name></row> </data> package…

Virtualbox安裝增強工具失敗

在安裝Virtualbox增強工具安裝時出現unable to find the sources of your current Linux kernel&#xff0c;安裝失敗&#xff0c;導致主機與虛擬機之間不能共享文件夾&#xff0c;不能復制粘貼&#xff0c;鼠標也不能直接移動到物理機&#xff0c;需要按快捷鍵才行。 解決辦法…