2017-03-09 107 views
0

我想反編譯一些C#代碼使用IEnumerators與yield-return,但沒有反編譯器麻煩將變量重命名爲有效的C#名稱。我嘗試過ILSpy,JustDecompile,dotPeek和Reflector,沒有成功。C#如何反編譯yield-return枚舉

反編譯到目前爲止例如:

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#代碼即可。

+3

這種類型的問題是專門針對SO的話題。我希望有5k +網站代表的人知道這一點。 – itsme86

+0

哦,是的,我已經在考慮1個解決方案,它會在主題上(至少是某種程度上),而這只是用一些正則表達式「手動」替換它。 – kajacx

回答

0

我結束了這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 

編輯:一些檢查後,它仍然不十分面面俱到,一旦我解決這個問題,我會更新表。