支持 dotnet 6 的 dnSpy 神器版本

官方的 dnSpy 在 2021 時,由于某些吃瓜的原因 wtfsck 將 dnSpy 給 Archived 掉,在大佬被哄好之前,預計是不再更新。最新官方版本對 dotnet 6 的支持較弱,對于很多 dotnet 6 應用都無法成功調試,附加調試上去將會讓應用卡住。好在 dnSpy 是開源的,也剛好 lsj 大佬改得動,于是改了一個支持 dotnet 6 的版本

什么是 dnSpy 神器?請看?神器如 dnSpy,無需源碼也能修改 .NET 程序 - walterlv

我現在使用最多的調試工具,除了 VisualStudio 之外,就是 dnSpy 工具了。使用 dnSpy 可以讓我方便調試用戶端的應用。在完成了將團隊里面最大的項目升級到 dotnet 6 時,就在升級過程遇到了一些問題,想要調試,卻發現沒有合適的工具,詳細請看 dotnet 6 在 Win7 系統證書鏈錯誤導致 HttpWebRequest 內存泄露

為了讓我減少加班,我請了?lsj?幫忙改改 dnSpy 神器,讓 dnSpy 可以調試 dotnet 6 的應用

這是支持 dotnet 6 版本的 dnSpy 神器下載地址,也是修改之后開源的地址:https://github.com/kkwpsv/dnSpy/releases/tag/6.1.9

如果大家下載不了,可以發郵件讓我用其他方式發給你

那改好了是不是就完成了?還有一個問題是為什么 dnSpy 對 dotnet 6 的支持較弱呢?有以下幾個原因,對應的修復方法還請看 lsj 的改動 https://github.com/kkwpsv/dnSpy/commit/a217b257453147c5d9db45070f7555f6395329bf

如?[DAC][DBI] ICorDebugModule::GetMetaDataInterface fails in net6.0 for "Anonymously Hosted DynamicMethods Assembly" in unit test project. · Issue #62977 · dotnet/runtime?所說的原因,由于?"Anonymously Hosted DynamicMethods Assembly"?沒有定義 IMetaDataImport2 接口,因此在?https://github.com/dnSpy/dnSpy/blob/2b6dcfaf602fb8ca6462b8b6237fdfc0c74ad994/Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/ModuleCreator.cs#L94-L96?將拿到空,如以下代碼,將拋出 InvalidOperationException 錯誤

var comMetadata = dnModule.CorModule.GetMetaDataInterface<IMetaDataImport2>();if (comMetadata is null)throw new InvalidOperationException();

修復的方式就是不拋出異常,而是自己定義一個 繼承 DmdLazyMetadataBytes 類型的 DmdLazyMetadataBytesNull 類型,進行返回,如以下代碼

if (comMetadata is null)// "Anonymously Hosted DynamicMethods Assembly" not implement IMetaDataImport2, we just return DmdLazyMetadataBytesNullreturn () => new DmdLazyMetadataBytesNull();

同時在 DmdAppDomainImpl.cs 里面,返回 DmdNullMetadataReader 即可,如此也許會影響讀取程序集的信息,但好過無法調試

這個?"Anonymously Hosted DynamicMethods Assembly"?沒有定義 IMetaDataImport2 接口,也影響 https://github.com/dnSpy/dnSpy/blob/2b6dcfaf602fb8ca6462b8b6237fdfc0c74ad994/Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorAssembly.cs#L56-L60?的代碼,如以下代碼,拿到的 ManifestModule 是空值。好在這里只是在 dnSpy 應用的 Debug 模式才會炸掉

var module = ManifestModule;Debug2.Assert(module is not null);

修復的方法只是將 Assert 的代碼干掉即可

經過以上更改,就可以讓 dnSpy 支持 dotnet 6 的調試

嗯,現在我覺得 dnSpy 作者做的還是太對了,我似乎越來越覺得開源也是一個不對的事情,那就是 SB 太多了。本來今天是想著將 dnSpy 在堆棧網上廣告一下,造福一下國外的小伙伴。可惜遇到了傻比,最后我將問題和回答都刪除了。這個事讓我更加理解了很多開源作者最后選擇了閉源的做法,以及讓我更加佩服維護社區的大佬們。有人問,原作者關閉了 dnSpy 的瓜是什么?其中一個瓜就是被傻子給氣的,開源了不收錢了,反而被當成理所當然,還要這要那,不滿足了還被罵。具體的瓜還請自己去找了

我認為所有的參與開源和分享知識的行為都理應受到表揚稱贊,共同維護一個良好的開發者生態

十分感謝?wtfsck?大佬提供的 dnSpy 神器,和?lsj?讓 dnSpy 支持 dotnet 6 調試

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

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

相關文章

cmd命令

mstsc 開啟遠程連接services.msc 開啟服務sc delete 服務名稱 刪除服務telnet 106.75.97.193 查看端口是否占用netstat -a 查看端口監聽狀態

Robot Framework 教程 (3) - Resource及關鍵字 的使用

From:http://www.cnblogs.com/buaawp/p/4754399.html Robot Framework 教程 (3) - Resource及關鍵字 的使用 在進行軟件自動化測試時&#xff0c;我們設計并編寫好一個測試腳本的業務邏輯之后&#xff0c;需要將其中的業務數據提取為變量&#xff0c;并對業務邏輯進行封裝。在后…

mysql中的操作指令,MySQL中常用指令操作的介紹(代碼示例)

本篇文章給大家帶來的內容是關于MySQL中常用指令操作的介紹(代碼示例)&#xff0c;有一定的參考價值&#xff0c;有需要的朋友可以參考一下&#xff0c;希望對你有所幫助。l 創建數據庫&#xff1a;CREATE DATABASE table_name;l 刪除數據庫&#xff1a;DROP DATABASE table_na…

mt19937 -- 高質量隨機數

優點:產生速度快, 周期大 用法: #include<bits/stdc.h> using namespace std;int main() {mt19937 mt_rand(time(0));cout << mt_rand() << endl;return 0; } 轉載于:https://www.cnblogs.com/widsom/p/9935561.html

使用 AutoMapper 自動在多個數據模型間進行轉換

訪問數據庫、IPC 通信、業務模型、視圖模型……對于同一個業務的同一種數據&#xff0c;經常會使用多種數據模型工作在不同的代碼模塊中。這時它們之間的互相轉換便是大量的重復代碼了。使用 AutoMapper 便可以很方便地在不同的模型之間進行轉換而減少編寫太多的轉換代碼&#…

集合類型內建方法

一、集合類型方法方法名稱 操作 s.issubset(t)如果s是t的子集&#xff0c;則返回True&#xff0c;否則返回Falses.issuperset(t)如果s是t的超集&#xff0c;則返回True&#xff0c;否則返回Falses.union(t)返回一個新集合&#xff0c;該集合是s和t的并集s.intersection(t)返回…

Maven基礎:Maven環境搭建及基本使用(1)

1. Maven環境搭建 1.1 Maven簡介 1.2 Maven下載及環境設置 Maven下載地址&#xff1a;http://maven.apache.org/download.cgi 當前下載版本&#xff1a;apache-maven-3.5.0-bin.zip&#xff0c;解壓之后路徑 D:\Program Files\apache-maven-3.5.0 Maven環境變量設置&#xff1a…

mysql主外鍵引用關系,關于mysql:數據主/外鍵關系

我想對于那些已經開發了許多數據庫模式的人來說&#xff0c;這將是一個簡單的答案&#xff0c;但是我最近發現自己承擔了優化(或嘗試優化)數據庫模式的任務&#xff0c;并且一直在閱讀"高性能MySQL"&#xff0c;并且剩下一個關于在模式中使用或"過度使用"外…

解讀微軟開源MMLSpark:統一的大規模機器學習生態系統

AI前線導讀&#xff1a;目前&#xff0c;有很多深度學習框架支持與Spark集成&#xff0c;如Tensorflow on Spark等。然而&#xff0c;微軟開源的MMLSpark不僅集成了機器學習框架&#xff08;CNTK深度學習計算框架、LightGBM機器學習框架&#xff09;&#xff0c;還可以將這些計…

floyd判環算法(龜兔賽跑算法)

floyd判環算法&#xff08;龜兔賽跑算法&#xff09; 注意&#xff0c;這個算法是用來判斷一條鏈一條環的圖&#xff0c;環的長度或者環與鏈的交界處的&#xff0c;所以此floyd非彼floyd&#xff08;雖然都是一個人想出來的&#xff09;。 &#xff08;圖不是我的&#xff09; …

一個redis的連接庫的實現

2019獨角獸企業重金招聘Python工程師標準>>> import socketdef format_message( args):"""Create redis message:param args:Message data"""l u"*%d" % len(args)lines [l.encode(utf-8)]for arg in args:if not isinst…

matlab 邊緣檢測不閉合,Matlab多種圖像邊緣檢測方法

1、用Prewitt算子檢測圖像的邊緣I imread(bacteria.BMP);BW1 edge(I,prewitt,0.04); % 0.04為梯度閾值figure(1);imshow(I);figure(2);imshow(BW1);2、用不同σ值的LoG算子檢測圖像的邊緣I imread(bacteria.BMP);BW1 edge(I,log,0.003); % σ2imshow(BW1);titl…

實現CSS在線美化(格式化)、壓縮、加密、解密、混淆工具-toolfk程序員工具網

本文要推薦的[ToolFk]是一款程序員經常使用的線上免費測試工具箱&#xff0c;ToolFk 特色是專注于程序員日常的開發工具&#xff0c;不用安裝任何軟件&#xff0c;只要把內容貼上按一個執行按鈕,就能獲取到想要的內容結果。ToolFk還支持 BarCode條形碼在線生成、 QueryList采集…

只是他給的實在太多了!

工作幾年后&#xff0c;總是會問自己一個問題&#xff0c;工作的意義是什么&#xff1f;這個如果要在網絡上尋找答案&#xff0c;那一定是多如牛毛&#xff0c;每一個人都有一套自己的看法。在一開始出入社會工作之時&#xff0c;我并沒有意識到這個問題&#xff0c;更沒有思考…

[ci]jenkins server啟動,通過jnlp的方式啟動slave(容器模式)

jenkins server啟動,通過jnlp的方式啟動slave. java -jar jenkins.jar 配置jnlp端口--全局安全 配置云 配置項目 執行成功 轉載于:https://www.cnblogs.com/iiiiher/p/7978831.html

Oracle 中UNDO與REDO的差別具體解釋

一 為了更清楚的看出2者差別&#xff0c;請看下表&#xff1a; UNDO REDO Record ofHow to undo a changeHow to reproduce a changeUsed forRollback, Read-ConsistencyRolling forward DB ChangesStored …

php實現文件留言,PHP文件操作及實例:留言板

一、文件操作函數1.創建文件&#xff1a;touch(./xxx.php);bool touch ( string $filename [, int $time time() [, int $atime ]] )2.復制文件&#xff1a;copy(./xxx.php,./yyy.php);3.移動或重命名&#xff1a;rename(./xxx.php,./yyy.php);4.刪除文件&#xff1a;unlink(.…

WPF-11 路由事件之一

什么是路由事件&#xff1f;我們從兩個維度來理解路由事件&#xff1a;功能的角度來看&#xff0c;路由事件是一種事件類型&#xff0c;不僅僅可以在事件源上處理事件響應&#xff0c;還可以在元素樹的多個偵聽器上處理事件響應(事件偵聽器是附加和調用事件處理程序的元素。事件…

個人總結的一個中高級Java開發工程師或架構師需要掌握的一些技能...

近三年&#xff0c;其實都是在做一個項目&#xff0c;項目是一個大型的多節點部署的項目&#xff0c;做了好幾個版本&#xff0c;中間用到了很多技術和框架&#xff0c; 也用了一些管理工具和敏捷實踐。我這里不是來說項目的&#xff0c;因為最近看了一些招聘信息&#xff0c;結…

Android 進程常駐(5)----開機廣播的簡單守護以及總結

這是一個輕量級的庫&#xff0c;配置幾行代碼。就能夠實如今android上實現進程常駐&#xff0c;也就是在系統強殺下&#xff0c;以及360獲取root權限下。clean master獲取root權限下都無法殺死進程 支持系統2.3到6.0 支持大部分設備&#xff0c;包含三星。華為。oppo&#xff0…