2016-06-18 2 views
0

J'ai un assemblage d'un programme pour lequel je n'ai pas accès au code source et je veux trier ses classes alphabétiquement par leur nom complet dans l'assemblage, au lieu d'utiliser l'ordre spécifié par le compilateur utilisé pour générer il.Comment trier les classes/champs/méthodes/propriétés dans un assembly .NET?

J'ai essayé d'utiliser Mono.Cecil pour cela, mais il semble que je ne puisse pas changer l'ordre des classes au sein de la propriété ModuleDefinition.Types car c'est un get-only IEnumerable.

Alors, comment puis-je modifier l'ordre des éléments d'un module d'assemblage? Ou est-ce impossible de le changer?

+0

'Alors, comment changer l'ordre des éléments d'un module d'assemblage? Voulez-vous changer leur ordre ou voulez-vous les afficher dans un certain ordre? – Eser

+0

Je veux changer leur ordre dans l'assemblage, de sorte que lorsque j'utilise des outils comme ILDasm, ils seront triés. –

+0

Désolé, je pensais que je connaissais la réponse, mais j'ai réalisé que je ne sais pas assez sur Mono.Cecil. Je pense qu'il n'est pas possible de faire ça avec Cecil, mais je ne suis pas sûr à 100%. –

Répondre

0

il semble que je ne peux pas changer l'ordre des classes au sein de la propriété ModuleDefinition.Types parce qu'il est un rendez-vous seulement IEnumerable.

Pas tout à fait, c'est un get-only Collection<T>. Cela signifie que vous pouvez changer l'ordre des types en récupérant la liste des types de la collection, en les triant, en effaçant Types et en les relisant enfin. Dans le code:

var assembly = AssemblyDefinition.ReadAssembly(inputPath); 

var module = assembly.MainModule; 

var sorted = module.Types.OrderBy(t => t.FullName).ToList(); 

module.Types.Clear(); 

foreach (var type in sorted) 
{ 
    module.Types.Add(type); 
} 

assembly.Write(outputPath); 
+0

Merci! Les classes sont maintenant entièrement triées! Je pensais à une manière similaire à cela, mais je pensais que cela dérangerait les références de classe, mais cela fonctionne réellement. –