Obtenir par programme des commentaires récapitulatifs lors de l’exécution

Je suis à la recherche d’un moyen d’obtenir par programmation la partie récapitulative des commentaires XML d’une méthode en ASP.net.

J’ai jeté un coup d’œil aux précédents articles liés et ils ne fournissent pas de moyen de le faire dans un environnement Web.

Je ne peux utiliser aucune application tierce et, en raison d’un environnement Web, les plug-ins Visual Studio ne sont pas d’une grande utilité non plus.

Le projet JimBlackler est ce que j’ai trouvé de plus proche d’une solution opérationnelle, mais il ne fonctionne que sur les DLL.

Naturellement, quelque chose comme «Fournir un fichier .CS, obtenir une documentation XML» serait optimal.


Situation actuelle

Je dispose d’un service Web et tente de générer de la documentation de manière dynamic.

Lire les méthodes et les propriétés est facile, mais obtenir le résumé pour chaque méthode me jette un peu.

///  /// This Is what I'm trying to read ///  public class Some_Method(){} 

Le résumé XML n’est pas stocké dans l’assemblage .NET. Il est éventuellement écrit dans un fichier XML dans le cadre de votre construction (en supposant que vous utilisez Visual Studio).

Par conséquent, il est impossible d’extraire les résumés XML de chaque méthode en réfléchissant sur un assemblage .NET compilé (.EXE ou .DLL), car les données ne sont tout simplement pas disponibles. Si vous souhaitez obtenir les données, vous devez indiquer à votre environnement de génération de générer les fichiers XML dans le cadre de votre processus de génération et d’parsingr ces fichiers XML au moment de l’exécution pour obtenir les informations récapitulatives.

Solution de contournement – Utilisation de la reflection sur Program.DLL / EXE avec le fichier Program.XML

Si vous examinez le fichier .XML frère généré par Visual Studio, vous constaterez qu’il existe une hiérarchie relativement plate de / members / member. Tout ce que vous avez à faire est d’obtenir chaque méthode de votre DLL via l’object MethodInfo. Une fois que vous avez cet object, vous passez au XML et utilisez XPATH pour obtenir le membre contenant la documentation XML pour cette méthode.

Les membres sont précédés d’une lettre. Les documents XML pour les méthodes sont précédés de “M:” pour la classe par “T:” etc.

Chargez votre XML frère

 ssortingng docuPath = dllPath.Subssortingng(0, dllPath.LastIndexOf(".")) + ".XML"; if (File.Exists(docuPath)) { _docuDoc = new XmlDocument(); _docuDoc.Load(docuPath); } 

Utilisez ce xpath pour obtenir le membre représentant la méthode XML docu

 ssortingng path = "M:" + mi.DeclaringType.FullName + "." + mi.Name; XmlNode xmlDocuOfMethod = _docuDoc.SelectSingleNode( "//member[starts-with(@name, '" + path + "')]"); 

Maintenant, parsingz les noms de fils pour toutes les lignes de “///” Parfois, le /// Résumé contient des blancs supplémentaires, si cela vous gêne, utilisez ceci pour supprimer

 var cleanStr = Regex.Replace(row.InnerXml, @"\s+", " "); 

Vous pouvez “documenter” votre méthode en utilisant l’atsortingbut System.ComponentModel.DataAnnotations.DisplayAtsortingbute , par exemple:

 [Display(Name = "Foo", Description = "Blah")] void Foo() { } 

utilisez ensuite la reflection pour extraire la description au moment de l’exécution.

Vous pouvez consulter https://github.com/NSwag/NSwag – source pour le nuget NSwag.CodeGeneration – le résumé, l’utilisation

 var generator = new WebApiAssemblyToSwaggerGenerator(settings);
var swaggerService = generator.GenerateForController("namespace.someController");
// ssortingng with comments
var swaggerJson = swaggerService.ToJson();

(essayez le décompilateur ILSPY contre votre dll, vérifiez le code et les commentaires)

Si vous avez access au code source pour lequel vous essayez d’obtenir des commentaires, vous pouvez utiliser la plate-forme de compilateur Roslyn pour le faire. En gros, il vous donne access à toutes les métadonnées du compilateur intermédiaire et vous permet de faire tout ce que vous voulez.

C’est un peu plus compliqué que ce que suggèrent d’autres personnes, mais selon vos besoins, cela pourrait être une option.

Il semble que ce post ait un exemple de code pour quelque chose de similaire.