min*_*iar 5 c# ide disassembly visual-studio rider
Visual Studio 2019 支持名为“在 Visual Studio 调试器中查看反汇编代码”的函数。但我想在 Rider 中使用“在调试器中查看反汇编代码”,而不是在 Visual Studio 2019 中。
我可以这样做吗?
我可以找到“IL View”,但这不是我的想法。
当我们等待 Rider 可能/希望集成此功能时,这里有一个选项在某些方面甚至比 Microsoft 的产品更好:较新LINQPad版本的组合反编译、IL 和本机反汇编视图。我一直使用 Rider 和 LINQPad,它们可以很好地互补。
readonly struct以下是我刚刚验证包装 an的抽象成本Int64确实为零的方法,正如我所希望的那样:
上部窗格显示带有嵌套循环的源代码,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,我就不可能有效地工作......
| 归档时间: |
|
| 查看次数: |
2078 次 |
| 最近记录: |