官方的 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. 【福利】JetBrains 全家桶永久免费使用

    Jetbrains系列的IDE公认是最好的集成开发工具,但是收费且挺贵.我们以PhpStorm为例,新用户第一年需要199$,注意是$,还不是人民币,这个价格一上来肯定筛选掉一大批用户.确实好用,所以 ...

  2. 创建远程仓库&克隆项目(Github)

    创建远程仓库 在GitHub上注册一个账号,之后creat a new repository 创建的远程仓库把它看作一个百度网盘就可以了 克隆项目 1.远程仓库可以下载\克隆到本地 code :git ...

  3. KingbaseES Create Index Concurrently 过程探究

    前言: 我们知道Oracle 可以通过create index online 在线创建索引,而不影响其他会话修改数据,但Oracle 实际在online 创建索引的最后一步,实际还是需要进行锁升级,申 ...

  4. 关于Actor Component的思考--学习斯坦佛UE+C++

    跟着B站的视频学习,感觉自己的头很混乱.所以浅浅总结一下创建Actor Component之后其的作用和相关操作. Actor Component 首先Component为一个组件,源码就是一个类的声 ...

  5. Android---intent和startActivityForResult方法的使用---页面跳转和数据回传

    Android页面跳转和数据回传 今天我尝试用两个页面实现数据的传递和回传,出现了一些问题,把问题已经成功的案例总结如下: 具体是这样的: 有两个layout布局,两个activity.MainAct ...

  6. Csharp线程

    CSharpe线程 目录 CSharpe线程 C#如何操作线程 Thread 1. Thread如何开启一个线程呢? 2. Thread中常见的API 3. thread的扩展封装 threadpoo ...

  7. #Tarjan,拓扑排序#洛谷 3436 [POI2006]PRO-Professor Szu

    题目 分析 考虑有向图缩点然后拓扑排序, 最恶心的地方是这题有自环, 一旦存在自环就意味着答案一定超过阈值 其实更难过的是Tarjan大小写写错没有发现qwq 代码 #include <cstd ...

  8. 并发和Read-copy update(RCU)

    目录 简介 Copy on Write和RCU RCU的流程和API RCU要注意的事项 RCU的java实现 总结 简介 在上一篇文章中的并发和ABA问题的介绍中,我们提到了要解决ABA中的memo ...

  9. 【直播回顾】OpenHarmony知识赋能五期第四课——子系统音频解读

    5月12日晚上19点,知识赋能第五期第四节课<OpenHarmony标准系统多媒体子系统之音频解读>,在OpenHarmony开发者成长计划社群内成功举行. 本期课程,由深开鸿资深技术专家 ...

  10. 在DAYU200上实现OpenHarmony视频播放器

    内容简介 本文介绍了如何使用ArkUI框架提供的video组件,实现一个具有简易播放器.通过VideoController控制器来控制倍速.全屏.进度调节等功能. 由于使用本地视频文件会影响App的包 ...