wmjordan / Codist

A visual studio extension which enhances syntax highlighting, quick info (tooltip), navigation bar, scrollbar, display quality, and brings smart tool bar with code refactoring to code editor.
https://marketplace.visualstudio.com/items?itemName=wmj.Codist
GNU General Public License v3.0
307 stars 28 forks source link

在查看Resharper反编译的代码时,有可能会抛出异常IndexOutOfRangeException #315

Closed QianMoXi closed 7 months ago

QianMoXi commented 8 months ago

可复现步骤

  1. 安装microsoft.entityframeworkcore 8.0.0版本的nuget包
  2. 反编译Microsoft.EntityFrameworkCore.Metadata.RuntimeModel代码
  3. 滚动到290行代码,鼠标移动到IsIndexerMethodmethodInfoimage
  4. 然后会弹出报错 image

报错

System.IndexOutOfRangeException: 索引超出了数组界限。
   在 Codist.SymbolFormatter.FormatMethodName(InlineCollection text, ISymbol symbol, String alias, Boolean bold) 位置 D:\Codes\Open Source Projects\Codist\Codist\Semantics\SymbolFormatter.cs:行号 769
   在 Codist.SymbolFormatter.ShowSignature(ISymbol symbol) 位置 D:\Codes\Open Source Projects\Codist\Codist\Semantics\SymbolFormatter.cs:行号 120
   在 Codist.QuickInfo.QuickInfoOverride.UIOverride.ShowAlternativeSignature() 位置 D:\Codes\Open Source Projects\Codist\Codist\QuickInfo\QuickInfoOverride.cs:行号 550
   在 Codist.QuickInfo.QuickInfoOverride.UIOverride.OnVisualParentChanged(DependencyObject oldParent) 位置 D:\Codes\Open Source Projects\Codist\Codist\QuickInfo\QuickInfoOverride.cs:行号 415

预期情况

正常显示提示,不会弹出异常报错窗口。 即使无法解析,也希望不要鼠标移动上去,一直弹出相同的报错,可弹出一次后续遇到相同的异常就不再提示了。不然的话,复制之类的操作不太方便

wmjordan commented 8 months ago

可能导致弹出报错窗口的相关代码如下所示。

https://github.com/wmjordan/Codist/blob/980aa20be2375370e2378c77e2f67ed7d3f7aa4e/Codist/Semantics/SymbolFormatter.cs#L781-L783

一个方法的类型既然是 ExplicitInterfaceImplementation,在 ExplicitInterfaceImplementations 就应该具有至少一个实现。出现 IndexOutOfRangeException 意味着没有接口方法实现。这应该是 Roslyn 的缺陷。

QianMoXi commented 8 months ago

我对Roslyn不熟悉,我的猜测是,可能是因为Resharper反编译的时候只传递了这一个文件,导致Roslyn无法解析IModel接口,因此ExplicitInterfaceImplementations就是空的? 我测试了一下VS自带的反编译,是不会有这个问题的,并且VS自带的反编译,能提示出IModel的信息,而Resharper反编译的就不行,会是个空的框。 VS自带的: image Resharper: image

不知道方不方便把现在的报错的情况,也改成这样空的提示,减少干扰

wmjordan commented 8 months ago

哦,原来是 Resharper 的问题。 我没有安装那个插件,所以无法重现出故障。VS 从来都没有这样的问题。

也许可以调整报错机制,在弹出的报错对话框中,增加一个“不再报告同类异常”的复选框。选中该复选框后,在重启 VS 之前就不再对相同的异常报错。

wmjordan commented 8 months ago

请下载这个测试版。它允许你暂时禁止 Codist 报告那个异常,直到重新启动 VS。 从根本上而言,要让 Resharper 解决问题。 Codist.zip

QianMoXi commented 8 months ago

感谢,我测试了一下,效果挺好。

这个用Resharper的反编译的原因在于VS自带的反编译框架程序集时,会反编译C:\Program Files\dotnet\packs\Microsoft.AspNetCore.App.Ref\8.0.1\ref\net8.0这种路径下的DLL,里面是没代码的,只有方法名称,目前只能选Resharper来用。 我找个时间会去Resharper反馈一下看看