【问题标题】:.net Reflector decompiled C# code won't compile.net Reflector 反编译的 C# 代码无法编译
【发布时间】:2013-03-21 18:50:28
【问题描述】:

我尝试反编译一个 C# 控制台应用程序并在 Visual C# 2010 中再次编译它,但代码中有很多错误。这是一个例子:

 public static Test mTest
    {
        [CompilerGenerated]
        get
        {
            return <mTest>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            <mTest>k__BackingField = value;
        }
    }

我已在 .net Reflector 中将 .net 框架版本设置为 3.5。有什么方法可以获取能够从 .net Reflector 重新编译的代码?

【问题讨论】:

  • &lt;mTest&gt;k__BackingField 是编译器生成的内部字段名称,它们不能用作源代码中的字段名称
  • 您使用的是什么版本的 Resharper?当前版本理解这一点,并将其变成自动道具
  • 好的,我试过了......你说得对,这似乎是 Reflector 中的一个错误。实例属性很好 - 但静态属性仍在添加支持字段。您能够(实际上)修复它的唯一方法是检查代码并用 { get; 替换 getter 和 setter。放; } - 或将支持字段重命名为有效的 c# 字段名称。

标签: c# .net reflector


【解决方案1】:

没有直接的方法可以克服这个限制。编译器从您的源代码创建了IL,而这个IL 可能包含有关您的初始源代码的信息。例如当你写

public string Property { get; set; }

编译器创建支持字段(例如 &lt;Property &gt;k__BackingField )并使用特殊符号命名,您不能在源代码中使用这些符号来命名您的字段。您给出了上面的示例,其中反射器试图推断编译器的含义。

我使用过dotPeek(JetBrains 的免费反编译器),它理解自动属性,因此您会在示例中看到正确的代码。但同样 - 可能存在 dotPeek 无法获取初始源代码的情况。

【讨论】:

  • 有什么办法可以修复代码并使其正确编译?
  • @user2196536 你应该在该字段中使用public static Test mTest { get; set; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
相关资源
最近更新 更多