官方的 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 DmdLazyMetadataBytesNull
return () => 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 调试

支持 dotnet 6 的 dnSpy 神器版本的更多相关文章

  1. CYQ.Data 正式支持 DotNET Core 版本发布

    闲话几句: 自从上周开始,IOS人员逝去,就开始接手IOS的代码了. 并开始整理IOS的代码(包括当时一开始设计的开发框架). 在未来不远的日子里,设想是有一个系列详细的介绍I恋App和IT连App及 ...

  2. ABP abp zreo 老版本 支持dotnet framework 4.0

    下载了个abp zreo的老版本,module-zero-template-1.5.1, 只有这个版本支持.net framework4.0,其它都依赖.net framework 4.5和4.6去了 ...

  3. FIREDAC连接MSSQL 2000报不能支持连接MSSQL2000及更低版本的解决办法

    FIREDAC连接MSSQL 2000的时候会报错,原因是MSSQL CLIENT11或MSSQL CLIENT10客户端驱动程序已经不支持连接MSSQL2000及更低版本的数据库. 解决办法: 设置 ...

  4. 无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539) 解决方案

    使用SQL2012附加一个数据库时报出了以下错误:“无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539).不能打开与此版本的 sqlserver.exe 不兼 ...

  5. Mybatis3.4.0不支持mybatis-spring1.2.5及以下版本

    今天将工程的Mybatis的版本由3.3.0升级到3.4.0导致程序运行错误,使用的mybatis-spring版本是1.2.3,错误内容如下,最后发现是SpringManagedTransactio ...

  6. (转)IHS配置安全漏洞: 支持不推荐使用的 SSL 版本、在降级的旧加密上填充 Oracle、检测到 RC4 密码套件、支持弱 SSL 密码套件、 重构 RSA 导出键(又称为 FREAK)

    原文:https://blog.csdn.net/lyd135364/article/details/52179426 都是由于ihs配置中支持不推荐使用的ssl版本和弱密码套件引起的. 只要在配置文 ...

  7. 超强PHP集成环境,支持800多个不同PHP版本同时运行,无限自定义添加mysql与php版本

    转载自今日头条 小编最近发现PHPWAMP竟然又更新了,激动之余向大家介绍一下新版的强大功能. PHPWAMP是纯绿色集成环境,高版本php无需安装VC运行库,默认已经集成VC运行库!Nginx支持服 ...

  8. Spring Cloud 2021.0.0 正式发布,第一个支持Spring Boot 2.6的版本!

    美国时间12月2日,Spring Cloud 正式发布了第一个支持 Spring Boot 2.6 的版本,版本号为:2021.0.0,codename 为 Jubilee. 在了解具体更新内容之前, ...

  9. Windows 10系统设置多用户同时远程登录教程 and rdpwrap下载 and Win10多用户同时远程桌面的另类解决方案---支持1809和1909和2004版本V2.0

    转载简书: Windows 10系统设置多用户同时远程登录教程 - 简书 (jianshu.com) 转载github: 发布 ·stascorp/rdpwrap ·GitHub 转载csdn: Wi ...

  10. LNMP下防跨站、跨目录安全设置,仅支持PHP 5.3.3以上版本

    PHP 5.3.3以上的版本,可以修改/usr/local/php/etc/php.ini在末尾里加入: [HOST=www.vpser.net] open_basedir=/home/wwwroot ...

随机推荐

  1. 开发一个本地的供需求平台软件小程序单靠广告费就能月入3w+,你觉得香不香!

    最近合作了一个客户,需求是把现成的这种网站包装成App,在各大应用商店也能下载,做用户留存. 需求不复杂,现在已经完工了.事后处于好奇我又分析了一下这个项目的商业模式发现还挺好的,看前台数据基本上已经 ...

  2. package.json报错"No license field"问题解决

    问题描述 warning package.json: No license field 问题原因 package.json中缺少license字段 解决方法 package.json中添加licens ...

  3. 记录--用 Vue 实现原神官网的角色切换效果

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 为了更好的了解原神角色,我模仿官网做了一个角色切换效果,在做的过程当中也总结了一些技术点. 为了让大家更好的体验,我兼容了 PC 端 ...

  4. 记录--Vue PC前端扫码登录

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 需求描述 目前大多数PC端应用都有配套的移动端APP,如微信,淘宝等,通过使用手机APP上的扫一扫功能去扫页面二维码图片进行登录,使得用户 ...

  5. 【已失效】Xcode GUI 添加 SPM 依赖的时候访问不了 github,无视 git config proxy 配置解决方案

    此 openradar 中提出者指出了原因:Xcode 调用 libgit2 时传入了 GIT_PROXY_NONE,无视了 git config 中的 proxy 配置.作者说用了自己打的 libg ...

  6. rust结构体包含另一个结构体引用时,serde序列化问题

    代码如下 use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] struct Person { id: Stri ...

  7. WPF实现树形表格控件(TreeListView)

    前言 本文将探讨如何利用WPF框架实现树形表格控件,该控件不仅能够有效地展示复杂的层级数据,还能够提供丰富的个性化定制选项.我们将介绍如何使用WPF提供的控件.模板.布局.数据绑定等技术来构建这样一个 ...

  8. #树形dp,二分#UVA1407 Caves 洛谷 3698 [CQOI2017]小Q的棋盘

    题目 给定一棵树,现在需要找到一条由节点1出发长度为\(x\)的路径, 问最多经过的节点数,重复经过只计算一次(不一定是简单路径) UVA的那道题多组数据多组询问,边权还不一定是1,\(n\leq 5 ...

  9. 一个库帮你快速实现EF Core数据仓储模式

    前言 EF Core是我们.NET日常开发中比较常用的ORM框架,今天大姚要分享的内容是如何使用EF Core Generic Repository通用仓储库来快速实现EF Core数据仓储模式. E ...

  10. 使用谷歌浏览器打开PDF文件,怎么关闭缩略图

    我们在使用谷歌浏览器浏览PDF文件时,总是会出现章节预览缩略图和工具栏,我们可以使用 参数来控制浏览器不显示出工具栏 #scrollbars=0&toolbar=0&statusbar ...