12 votes

Classe créée dynamiquement dans un fichier cs ?

Je crée une classe complexe avec AssemblyBuilder à partir de laquelle je crée ensuite des objets. Il y a cependant des incertitudes sur la façon dont cette classe est réellement construite. Existe-t-il un moyen d'écrire cette classe créée dynamiquement dans un fichier cs pour l'inspecter ?

Je peux faire écrire le fichier dll sur le disque mais j'ai besoin du fichier cs.

5voto

Access Denied Points 3936

Vous pouvez décompiler les dll .NET gérés en code C# en utilisant

  • DotPeek par JetBrains (gratuit, les sources sont fermées)
  • ILSpy projet open source (les sources sous licence MIT sont disponibles à l'adresse suivante github )
  • Réflecteur par Red Gates (Outil payant, les sources sont fermées)
  • JustDecompile par Telerik (gratuit avec un moteur de décompilation open source disponible à l'adresse suivante github Licence Apache)
  • Il y a aussi un programme de Microsoft ildasme outil.

Si vous avez besoin d'écrire un outil personnalisé, vous pouvez télécharger un code source ouvert et l'essayer.

2voto

emmanuel Points 133

Avez-vous l'obligation d'utiliser AssemblyBuilder ? Je pose la question parce que AssemblyBuilder ne vous permettra pas de voir la classe générée sans utiliser un décompilateur et si la classe que vous générez est assez compliquée, le code décompilé ne sera pas de bonne qualité.
Vous êtes quasiment dans la même situation si vous utilisez Reflection.Emit parce qu'il génère des IL de bas niveau.
Si vous avez vraiment besoin de voir le code source que vous générez dynamiquement, votre meilleure option est CodeDom . Voici un exemple Comment faire : Créer une classe à l'aide de CodeDOM

0voto

jan.h Points 524

Vous pourriez être en mesure de faire d'une pierre deux coups avec Roslyn (alias " .NET Compiler Platform "). Vous aurez besoin du paquet Microsoft.CodeAnalysis.CSharp .

Tout d'abord, vous pouvez utiliser le SyntaxFactory pour générer des nœuds syntaxiques, que vous pouvez combiner en structures plus importantes (membres, méthodes, classes, espaces de noms, unités de compilation).
Vous pouvez également obtenir une représentation joliment formatée de vos nœuds syntaxiques avec ToString() o ToFullString() (avec une indentation correcte, des sauts de ligne et tout le reste), ce qui est ce que vous recherchiez à l'origine.

Il existe de nombreux tutoriels en ligne sur la façon d'utiliser cette API (par ex. 1 , 2 ), et il y a le Quoter Roslyn site web qui peut convertir un morceau de code C# en SyntaxFactory appels.

Deuxièmement, vous pouvez ensuite utiliser le résultat CSharpSyntaxNode pour créer un CSharpSyntaxTree que vous pouvez compiler en IL à l'aide de la fonction CSharpCompilation (après tout, Roslyn est le compilateur C# de référence).
Si vous voulez, vous pouvez même émettre l'assemblage généré dans un flux, récupérer les données binaires de l'assemblage à partir de là, et charger votre assemblage nouvellement créé dans votre assemblage en cours d'exécution, et instancier dynamiquement les types que vous venez de définir.

0voto

prosti Points 4630

Vous devez utiliser la réflexion .NET.

Ildasm.exe ne peut pas vous aider car il ne créera pas le fichier .cs dont vous avez besoin.

Donc, soit le ILSpy est le navigateur et décompilateur d'assemblages .NET à code source ouvert de l'équipe SharpDevelop ou dotPeek de Jetbrains.

Selon la plate-forme, vous pouvez également vérifier Mono Cecil . Cecil est une bibliothèque écrite par Jb Evain pour générer et inspecter des programmes et des bibliothèques au format ECMA CIL.

Si vous avez besoin de vitesse JustDecompile de Telerik est un outil gratuit de navigation et de décompilation d'assemblages .NET qui prétend être 10 fois plus rapide que ses concurrents.

Tous ces outils vous permettent de prendre un assemblage compilé existant (.dll ou .exe) et de parcourir facilement les symboles qu'il contient, puis de décompiler tout aussi facilement le langage d'assemblage en C# et IL lisibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X