首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反编译IEnumerators

反编译IEnumerators
EN

Stack Overflow用户
提问于 2016-08-03 02:22:46
回答 1查看 2.6K关注 0票数 3

出于好奇,我决定尝试对我的项目代码进行反编译。我提取了程序集.dll文件,并使用ILSpy对其进行反编译。除了IEnumerator<>方法之外,它似乎工作正常。

代码语言:javascript
复制
IEnumerator sP()
{
        for (int i = 0; i < maxEnemies; i++)
        {
            var p = Porczaks[Random.Range(0, Porczaks.Length)];
            Instantiate(p, new Vector3(Random.Range(245, 360), 16.8f, Random.Range(292, 366)), Quaternion.Euler(0f, Random.Range(0f, 359f), 0f));
            yield return new WaitForEndOfFrame();
        }
}

..。例如,被解码为:

代码语言:javascript
复制
[DebuggerHidden]
private IEnumerator sP()
{
    WaveManager.<sP>c__Iterator7 <sP>c__Iterator = new WaveManager.<sP>c__Iterator7();
    <sP>c__Iterator.<>f__this = this;
    return <sP>c__Iterator;
}

有什么方法可以准确地解压缩IEnumerator

编辑:i使用dotPeek反编译器对同一个程序集进行反编译,它创建了更多的代码。尽管我仍然不确定变量是否可以在.net中有这样的名称:

代码语言:javascript
复制
// Method sP with token 060000AB
[/*Attribute with token 0C000051*/DebuggerHidden]
private IEnumerator sP()
{
    WaveManager.\u003CsP\u003Ec__Iterator7 sPCIterator7 = new WaveManager.\u003CsP\u003Ec__Iterator7();
    sPCIterator7.\u003C\u003Ef__this = this;
    return (IEnumerator) sPCIterator7;
}

// Type <sP>c__Iterator7 with token 02000031
[/*Attribute with token 0C000026*/CompilerGenerated]
private sealed class \u003CsP\u003Ec__Iterator7 : IEnumerator<object>, IEnumerator, IDisposable
{
    // Field <i>__0 with token 040000C7
    internal int \u003Ci\u003E__0;
    // Field <p>__1 with token 040000C8
    internal GameObject \u003Cp\u003E__1;
    // Field $PC with token 040000C9
    internal int \u0024PC;
    // Field $current with token 040000CA
    internal object \u0024current;
    // Field <>f__this with token 040000CB
    internal WaveManager \u003C\u003Ef__this;

    // Property System.Collections.Generic.IEnumerator<object>.Current with token 17000017
    object IEnumerator<object>.System\u002ECollections\u002EGeneric\u002EIEnumerator\u003Cobject\u003E\u002ECurrent
    {
      // Method System.Collections.Generic.IEnumerator<object>.get_Current with token 060000EA
      [/*Attribute with token 0C00006E*/DebuggerHidden] get
      {
        return this.\u0024current;
      }
    }

    // Property System.Collections.IEnumerator.Current with token 17000018
    object IEnumerator.Current
    {
      // Method System.Collections.IEnumerator.get_Current with token 060000EB
      [/*Attribute with token 0C00006F*/DebuggerHidden] get
      {
        return this.\u0024current;
      }
    }

    // Method .ctor with token 060000E9
    public \u003CsP\u003Ec__Iterator7()
    {
      base.\u002Ector();
    }

    // Method MoveNext with token 060000EC
    public bool MoveNext()
    {
      uint num = (uint) this.\u0024PC;
      this.\u0024PC = -1;
      switch (num)
      {
        case 0:
          this.\u003Ci\u003E__0 = 0;
          break;
        case 1:
          this.\u003Ci\u003E__0 = this.\u003Ci\u003E__0 + 1;
          break;
        default:
          return false;
      }
      if (this.\u003Ci\u003E__0 < this.\u003C\u003Ef__this.maxEnemies)
      {
        this.\u003Cp\u003E__1 = this.\u003C\u003Ef__this.Porczaks[UnityEngine.Random.Range(0, this.\u003C\u003Ef__this.Porczaks.Length)];
        UnityEngine.Object.Instantiate((UnityEngine.Object) this.\u003Cp\u003E__1, new Vector3((float) UnityEngine.Random.Range(245, 360), 16.8f, (float) UnityEngine.Random.Range(292, 366)), Quaternion.Euler(0.0f, UnityEngine.Random.Range(0.0f, 359f), 0.0f));
        this.\u0024current = (object) new WaitForEndOfFrame();
        this.\u0024PC = 1;
        return true;
      }
      this.\u0024PC = -1;
      goto default;
    }

    // Method Dispose with token 060000ED
    [/*Attribute with token 0C000070*/DebuggerHidden]
    public void Dispose()
    {
      this.\u0024PC = -1;
    }

    // Method Reset with token 060000EE
    [/*Attribute with token 0C000071*/DebuggerHidden]
    public void Reset()
    {
      throw new NotSupportedException();
    }
}

似乎dotPeek没有正确地处理<>,但是这段代码有价值吗?

EN

回答 1

Stack Overflow用户

发布于 2016-08-16 23:07:16

您确实可以看到编译器生成的样板代码来替换收益率返回语句。是的,它确实是一个国家机器。

通常,反编译程序应该能够识别编译器生成的样板代码,并用正确的C#语句替换它。然而,这种识别是通过模式匹配完成的,即样板代码预计将以非常具体的方式构造。如果编译器生成相同的代码,但具有不同的结构(例如,由于编译器升级、优化等)然后,反编译器无法匹配模式并识别收益率语句。

您应该做的是向反编译团队提交一个bug报告,这样就可以解决这个问题,并且不必手动重命名。你试过那个程序集上的JustDecompile吗?它也失败了吗?如果是这样的话,你可以在Telerik论坛上发布这篇文章,我们会处理的。

顺便提一句,您使用了什么编译器?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38733346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档