【问题标题】:why my ILSpy shows a different version of code?为什么我的 ILSpy 显示不同版本的代码?
【发布时间】:2021-01-27 23:22:58
【问题描述】:

我是 C# 和 .net 的新手,如果我的问题听起来很愚蠢,请见谅。

我遵循一个在线教程,该教程教授如何检查编译的代码,下面是讲师的快照:

下面是我电脑的截图:

您可以看到我的代码是纯 IL 代码,即使我将设置更改为 C#: 不再有<Main>d_0 部分,代码是纯C# 代码。 那么如何切换到视图,以便我可以像讲师一样看到“更高级的 C# 代码”?

【问题讨论】:

  • 看到工具栏中显示“IL”的下拉框了吗?将其更改为“C#”。
  • @Corey 感谢您的回答。我实际上已经这样做了,但它仍然不起作用,请参考我刚刚添加的新截图的编辑帖子

标签: c# .net


【解决方案1】:

与您的讲师相比,您使用的是更现代的 ILSpy 版本。您的更现代的版本可以更好地反转 C# 的新语言功能到更简单的 C# 代码。

例如,旧版本的 ILSpy 无法将带有 await 关键字的 async 方法反编译回单一源方法,而是将它们显示为它们的已编译多方法状态机(正如您所见,TaskAwaiter<Main>d_0 中是如何暴露的)。

如果您想要与您的讲师相同的显示器,您需要使用与他们相同版本的 ILSpy。从屏幕截图看来,他们使用的是 ILSpy 版本 4 或更早版本 - 现在 非常 已经过时了。您应该告诉您的教师获取最新版本(截至 2020 年 11 月为 6.1 版)。

【讨论】:

  • 我怀疑你也可以从C# 8.0 减少版本。这可能会限制 ILSpy 将尝试使用的语言模式。
  • OP 可以关闭“反编译异步方法”以获得相同的视图。
【解决方案2】:

ILSpy 工具栏有一组按钮供您选择

  • 仅显示公共类型和成员
  • 显示公共、私有和内部(默认)
  • 显示所有类型和成员(包括编译器生成的)

如果您选择“显示所有类型和成员”,即使启用了 async 功能的反编译,您也会看到编译器生成的类及其 MoveNext 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多