【问题标题】:How to make Reflector not Choke on new syntax如何使反射器不会因新语法而窒息
【发布时间】:2010-08-21 22:07:51
【问题描述】:

有没有办法让反射器反汇编回新的 c# 结构?

自动实现的属性如下:

[CompilerGenerated]
private string <TypeName>k__BackingField;
 public string TypeName
 {
     [CompilerGenerated]
     get
      {
         return this.<TypeName>k__BackingField;
      }
      [CompilerGenerated]
      private set
      {
          this.<TypeName>k__BackingField = value;
      }
 }

带有字符串整数或对象的泛型类型出现错误:

Tuple&lt;User,String&gt;&lt;User,string&gt;

更不用说为响应某些基于 lambda 的代码而生成的令人困惑的枚举数了。

有什么想法吗?回到原来的形式会很棒,但达到等效的可编译状态将是向前迈出的一大步。上述示例不是有效的 C# 代码。

【问题讨论】:

    标签: c# decompiling reflector decompiler


    【解决方案1】:

    关于自动实现的属性,它们在最新版本中表现良好(即 get; set; 没有编译器生成的支持字段)。只需确保在View -&gt; Options -&gt; Disassembler 中将Optimization 设置为.NET 3.5.NET 4.0

    【讨论】:

    • 部分或全部(不确定)静态自动道具在 .net 4.0 设置中仍然存在问题。
    【解决方案2】:

    并非所有内容都是双向翻译。诸如 lambda 表达式、迭代器和自动实现的属性之类的东西是 C# 中的语法糖,可以为我们编译成真正的代码。并不总是可以获取此编译后的代码并确定原始代码的样子。

    如果 Reflector 对代码做出假设以检测这些句法抽象的结果,然后微软更改了编译器,它将再次被破坏。相反,Reflector 似乎选择将其反编译基于 CLR 和语言规范,这些规范不太容易更改,恕不另行通知。

    【讨论】:

    • 错误答案:在 lambda 表达式、迭代器和自动实现的属性的情况下,这显然是可能的。 Reflector 目前还做不到。
    • @Timwi:我不相信这显然是可能的,我也不同意它应该这样做。这样做就是对无法保证的代码做出假设。
    • 我认为 RedGate 不在乎你认为它应该做什么。此外,它已经做了很多假设,它仍然是一个有用的工具。对 autoprops 和所有其他功能的支持将使它成为比现在更好的工具,因为现在它正在生成甚至不解析的 C# 代码。
    • @Timwi:不解析的代码和无效的代码是不同的东西。生成的代码在给定的 CLR 规范下有效。
    • 问题是它生成的代码无法编译。回到原来的形式会很棒,但达到等效的可编译状态将是向前迈出的一大步。我要在上面添加这个。
    【解决方案3】:

    嗯,很明显,Reflector 还没有这个功能。它甚至还没有赶上 C# 3.0,更不用说 C# 4.0。等待下一个版本(如果有的话)。

    【讨论】:

      猜你喜欢
      • 2013-05-25
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 2020-10-15
      • 2011-07-27
      • 2020-06-04
      相关资源
      最近更新 更多