Jetbrains Rider 是否具有在 Visual Studio 调试器中查看反汇编代码之类的功能

min*_*iar 5 c# ide disassembly visual-studio rider

Visual Studio 2019 支持名为“在 Visual Studio 调试器中查看反汇编代码”的函数。但我想在 Rider 中使用“在调试器中查看反汇编代码”,而不是在 Visual Studio 2019 中。

我可以这样做吗?

我可以找到“IL View”,但这不是我的想法。

Dar*_*zka 3

当我们等待 Rider 可能/希望集成此功能时,这里有一个选项在某些方面甚至比 Microsoft 的产品更好:较新LINQPad版本的组合反编译、IL 和本机反汇编视图。我一直使用 Rider 和 LINQPad,它们可以很好地互补。

readonly struct以下是我刚刚验证包装 an的抽象成本Int64确实为零的方法,正如我所希望的那样:

组合反编译、IL 和本机反汇编视图 (如有需要请点击放大)

上部窗格显示带有嵌套循环的源代码,for该循环重复调用静态方法BT.ERezeptId并将结果填充到数组中。

反编译窗格(左)显示编译器已有效地将for循环转换为等效while循环。

我将IL 窗格(中间)仅集中在内部循环上,因为在 IL 中,循环设置和外部循环添加了很多无聊的行。

机代码窗格(右)显示编译器在优化 IL 时消除了相当多的错误。它具有有效的内联/扁平化调用,这些调用在源代码级别上有几层深度,从而消除了所有抽象成本。该代码就像处理裸结构Int64而不是处理包装结构一样高效。

从以下事实可以看出这一点:在源代码级别调用的方法是zufaellig(),而在本机代码中调用的方法是Zufallswert()。事实上,编译器只是在那时停止内联,因为我命令它这样做!

以下是被消除的抽象洋葱层(所有这些都驻留在引用的程序集中,而不是当前的源文件中):

public readonly partial struct ERezeptId
{
    private readonly long m_Wert;

    public ERezeptId (Ungeprueft<long> ungeprueft)
    {
        m_Wert = ungeprueft.Wert;
    }

    // ...

    public static ERezeptId zufaellig (Random rng)
    {
        return new ERezeptId(new Ungeprueft<long>(Zufallswert(rng)));
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static long Zufallswert (Random rng)
    {
        // ...
    }
}

public readonly struct Ungeprueft<T>
{
    public readonly T Wert;

    public Ungeprueft (T wert)
    {
        Wert = wert;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这个Ungeprueft<>东西(德语中“未检查”的意思)是我的一个标准模板,当故意绕过参数验证时,它会变得明确。

注意:此答案不显示如何在 Rider 中查看反汇编 - 这是 OP 所要求的 - 因为该功能在 Rider 中尚不可用。然而,对于任何 Rider 用户或任何 .NET 程序员来说,LINQPad 都是一个有用的东西。事实上,如果到了紧要关头,我也许可以——伴随着很多咒骂和生产力损失!- 使用另一个 IDE 而不是 Rider,但如果没有 LINQPad,我就不可能有效地工作......