2009-03-15 5 views
15

Je dois convertir le code IL en C#. J'ai un assemblage et je lis cet assemblage. Je reçois MethodBody de MethodInfo et le methodbody a une méthode GetILAsByteArraY() qui retourne un tableau d'octets maintenant je veux convertir ce code IL en C#. S'il vous plaît aidez-moi à résoudre ce problème.Conversion du code IL en C#

+0

Décision unanime! –

+1

Pour quoi avez-vous besoin de cela? Si vous décrivez votre situation de manière un peu plus détaillée, nous pouvons peut-être suggérer plus de .NET Reflector. –

+1

@Anton Nous ferions probablement mieux de ne pas comprendre ce hackery. –

Répondre

20

Ne pas réinventer la roue; utilisez Lutz Roeder .NET Reflector.

+3

Ce n'est plus Lutz. – Will

+21

Je pense qu'il est clairement évident qu'il essaie de créer une autre roue comme celle de .NET Reflector et il veut savoir comment c'est fait. Lutz ne devrait pas nécessairement être le seul homme au monde qui sait comment le faire. –

+0

@HasanKhan étant donné le choix de réponse d'OP, il est plutôt content que Lutz soit le seul homme :) – nawfal

1

Voyons voir si je parviens à l'obtenir en premier: .NET Reflector! Cela devrait vraiment être une FAQ ...

1

Ne pouvez-vous pas faire cela avec Reflector?

Vous pouvez charger un ensemble et voir comme VB.net/C#/IL ...

0

Il n'y a aucun outil dans le BCL qui fera cela; Cependant, il existe un excellent outil appelé Reflector, pour lequel vous pouvez écrire vos propres compléments. Donc, vous pourriez probablement l'utiliser pour obtenir les données que vous voulez.

0

Reflector fait cela. Peut-être pourriez-vous utiliser Reflector against Reflector et apprendre comment il gère le problème. Vous pourriez également dire pourquoi vous voulez faire ceci - il pourrait y avoir une meilleure solution à votre problème global. Permettez-moi d'être le premier à vous suggérer de prendre une copie du réflecteur de Red Gate.

+3

Les internes des réflecteurs ont été obscurcis en utilisant des non-imprimables (au moins, lutz l'a fait). Alors que oui vous pourriez réfléchir sur lui-même une meilleure question serait-il vraiment la peine que ... – JoshBerke

+0

Oui, c'est ce que je soupçonnais. C'est pourquoi je lui ai demandé pourquoi il voulait le faire. –

0

+0

C'est comme crier * PREMIER! * Et se tromper .... – cjk

+1

@ck Eh bien, vous répondez à une question et après avoir frappé Soumettre 50 autres personnes ont déjà répondu. O bien ... – Will

0

Peut-être que vous devriez essayer Dis # si vous ne voulez pas réinventer la roue ... C'est presque le meilleur outil pour convertir le code NetDASM a un outil qui vous permet de convertir C# en IL. Peut-être devriez-vous jeter un coup d'œil à cela.

9

Ré-inventer la roue sûrement une meilleure façon d'apprendre! vous devrez créer votre propre classe qui convertirait iL en C#. Cela nécessite la connaissance du langage intermédiaire.

Je suppose que vous avez déjà converti le tableau d'octets aux instructions IL comme nous le voyons dans ildasm.exe, utilisant Reflection.Emit.OpCodes, OpCode.OperandType, BitConvertor.ReadByte(), etc. BitConvertor.ReadInt32

3

Si vous voulez le faire vous-même, vous pouvez commencer à partir de l'ancien Cecil.Decompiler et l'améliorer, voir the source code et an old post of Jb. Evain announcing the project (Lien vers le bas).

+0

Les deux liens sont cassés. –

+0

Fixé le premier, ne peut rien faire à propos de la seconde car je ne sais pas pourquoi il a mis son blog hors ligne, même s'il le référence toujours sur Twitter. –

1

Pour les moteurs de recherche, Reflector n'est plus gratuit. Mais un outil plus récent et meilleur et pour ne pas mentionner GRATUIT est offert par telerik appelé JustDecompile. Je viens de télécharger ceci et c'est tellement génial et c'est juste une version bêta. Apparemment, telerik promet gratuitement pour toujours.

15

Le réflecteur Lutz Roeder a été acheté et n'est plus disponible en téléchargement gratuit.

Il existe maintenant un outil gratuit (encore une fois) appelé ILSpy. Je l'ai trouvé très bon, et il générera non seulement le code C# de IL mais créera également un projet .csproj si décompiler un ensemble de DLL entier.