【发布时间】: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