【问题标题】:C# how to decompile yield-return enumeratorsC#如何反编译yield-return枚举器
【发布时间】:2017-07-29 19:42:17
【问题描述】:

我正在尝试反编译一些使用带有 yield-return 的 IEnumerator 的 C# 代码,但没有反编译器会费心将变量重命名为有效的 C# 名称。我尝试过 ILSpy、JustDecompile、dotPeek 和 Reflector,但没有成功。

到目前为止的反编译示例:

private IEnumerator _WaitForSecondsThenStop(float startToFadeTime, float fadeOutLength)
{
    AudioObject.<_WaitForSecondsThenStop>c__Iterator0 <_WaitForSecondsThenStop>c__Iterator = new AudioObject.<_WaitForSecondsThenStop>c__Iterator0();
    <_WaitForSecondsThenStop>c__Iterator.startToFadeTime = startToFadeTime;
    <_WaitForSecondsThenStop>c__Iterator.fadeOutLength = fadeOutLength;
    <_WaitForSecondsThenStop>c__Iterator.<$>startToFadeTime = startToFadeTime;
    <_WaitForSecondsThenStop>c__Iterator.<$>fadeOutLength = fadeOutLength;
    <_WaitForSecondsThenStop>c__Iterator.<>f__this = this;
    return <_WaitForSecondsThenStop>c__Iterator;
}

ILSpy 应该是 able to 正确反编译枚举器,但它对我不起作用。在某处我读过它可能是由于代码的一些优化导致 ILSpy 无法识别模式,所以它可能是由这个引起的。

但是,我想问的是:是否有一个 C# 反编译器可以将所有字段、变量和类重命名为有效的 C# 名称?只要能编译为正确的 C# 代码,我就可以接受状态自动机的疯狂。

【问题讨论】:

  • 这类问题对于 SO 来说是特别离题的。我希望拥有 5k+ 站点代表的人知道这一点。
  • 哦,是的,没错,我已经在考虑一种解决方案,可以使它成为主题(至少在某种程度上),那就是用一些正则表达式“手动”替换它。跨度>
  • 您使用的是哪个版本的 ILSpy? 2.x 版本在 View -> Options -> Decompile Enumerators 中有一个选项 - 如果选中它,它应该会给你实际的 yield 语句。在 3.x 中它是自动完成的,您无法将其关闭。

标签: c# ienumerable decompiling yield-return


【解决方案1】:

我最终用这 4 个正则表达式更改了名称:

Pattern               Replacement       What it fixes
<(\w+)>c__Iterator    Iter_$1           <_WaitForSecondsThenStop>c__Iterator
<(\w+)>_              _L_$1_            <form>__2
<\$?>                 _S_               <$>startToFadeTime
\$(\w+)               _SS_$1            $current

编辑:经过一番检查,它仍然没有完全涵盖所有内容,我会在修复后更新表格。

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 1970-01-01
    • 2011-10-07
    • 2023-03-10
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多