2013-03-21 99 views
0

我试着反编译C#控制台应用程序并在Visual C#2010中重新编译它,但代码中有很多错误。这里是一个例子:.net Reflector反编译C#代码不会编译

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

我已经将.net框架版本设置为3.5在.net反射器。有什么办法可以获得能够从.net Reflector重新编译的代码吗?

+5

' k__BackingField'是编译器生成的内部字段名称,它们不能用作源代码中的字段名称 – 2013-03-21 18:51:24

+0

您使用的是什么版本的Resharper?目前的版本理解这一点,并将其变成一个自动支撑 – 2013-03-21 18:57:30

+0

好吧,我试过了......你说得对,就像反射器中的一个bug。实例属性很好 - 但静态的还在添加后台字段。唯一能够解决这个问题的方法就是通过代码来代替getter和setter与{get;组; }或将后台字段重命名为有效的c#字段名称。 – 2013-03-22 00:20:59

回答

3

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

public string Property { get; set; } 

编译器(例如<Property >k__BackingField)并将其命名为使用特殊符号,你不能用它来命名在源代码中你的领域建立支持字段。你给出了上面的例子,反射器试图推导出编译器的含义。

我已使用dotPeek(JetBrains提供的免费反编译器),它可以理解autoproperties,因此您会在示例中看到正确的代码。但是,再次 - 有些情况下,dotPeek将无法获得最初的源代码。

+1

有什么方法可以修复代码并使其正确编译? – user2196536 2013-03-21 18:58:58

+0

@ user2196536你应该使用'public static Test mTest {get;组;这个领域 – 2014-10-26 18:34:01