2017-03-09 3 views
0

J'essaye de décompiler du code C# qui utilise IEnumerators avec yield-return, mais pas de décompiler des traceurs pour renommer les variables en noms C# valides. J'ai essayé ILSpy, JustDecompile, dotPeek et Reflector sans succès.C# comment décompiler les énumérateurs yield-return

exemple décompilé jusqu'à présent:

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 est censé être able to recenseurs décompiler correctement, mais il ne fonctionne pas pour moi. Quelque part j'ai lu, il pourrait être causé par certaines optimisations du code qui rendent impossible à ILSpy de reconnaître les modèles, donc cela peut être causé par cela.

Cependant, ce que je veux demander est ceci: Y at-il un décompilateur de C# qui renommera tout le champ, les variables et les classes aux noms valides de C#? Je vais bien avec la folie d'automate d'état, tant qu'elle compile comme un bon code C#.

+3

Ce type de question est spécifiquement hors sujet pour SO. Je m'attendrais à ce que quelqu'un avec 5k + représentant du site le sache. – itsme86

+0

Oh oui c'est vrai, je pensais déjà à une solution qui le rendrait sur le sujet (du moins en quelque sorte), et ce serait juste de le remplacer "manuellement" avec quelques expressions rationnelles. – kajacx

Répondre

0

Je fini par changer les noms de ces 4 regexes:

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

EDIT: après une inspection, il ne couvre toujours pas tout à fait tout, je vais mettre à jour la table une fois que je le fixe.