Follow us on Twitter

Product Comparisons

Below is a comparison of the Documentation Comment generation tools available for recent versions of Visual Studio. We keep this table up to date with recent releases (updated every couple of months), and have tried to be totally objective, so if you feel anything is missing or incorrect in this table, please let us know and we'll double-check our facts.

The systems compared below are:

  • VS: the built-in Visual Studio features
  • GD: GhostDoc (2022.x),
  • GDP: GhostDoc Pro (2022.x),
  • APD: Atomineer Pro Documentation (10.x),

Please note that some other commercial add-ins provide simple 'boilerplate'-based comment creation, and others provide advanced documentation authoring and export processes. However, neither of these types of add-in provide the source-code documentation-generation features that are being compared here, so are not directly comparable. Historically other comment generation addins were available (.NET Documentor, CommentMakerPro), but they all appear to have been discontinued.

Supported LanguagesVSGDGDPAPD
Visual Basicyesyesyesyes

Supported Documentation FormatsVSGDGDPAPD
Documentation XMLyesyesyesyes
Qt QDoc---yes
Natural Docs---yes

Support for Multiple Documentation FormatsVSGDGDPAPD
Independent documentation formats/styles for each Language---yes
Independent documentation formats/styles for each Solution---yes
Independent documentation formats/styles for each Project---yes
Configurable comment generation for any other filetype---yes

Documentation Block FeaturesVSGDGDPAPD
Generate new Doc Comment blockyesyesyesyes
Create comments for all code elements in a Scope in one pass---yes
Create comments for all code elements in a Type in one pass--yesyes
Create comments for all code elements in a File in one pass--yesyes
Create comments for all code elements in Open Files in one pass---yes
Create comments for all code elements in a Project in one pass--yesyes
Create comments for all code elements in a Solution in one pass---yes
Remove all doc comments from a file in one pass---yes
Support single-line comment format, e.g. /// ...yesyesyesyes
Support multi-line comment format, e.g. /** ... */---yes
Optionally place a #region around the doc comment---yes
Optionally place a #region around the entire code element---yes
Optional, configurable top/bottom separator lines---yes
Configurable whitespace within the comment block---yes
Configurable whitespace above/below the comment block---yes
Configurable ordering of block elementsyes-yesyes
Configurable and custom documentation tags/commands---yes
Optionally use end of line ///< comments for variables & enum entries---yes
Optionally restrict documentation to public/protected/internal---yes
Independent configuration settings per-Solution or per-Project---yes

Documentation Entry FeaturesVSGDGDPAPD
Word-wrap entry text---yes
File header comments---yes
File footer comments---yes
Namespace comments---yes
Member variable summary---yes
Class summary---yes
Generic Class type-parameters-yesyesyes
Interface summary---yes
Enum summary---yes
Enum entry summary---yes
Struct summary---yes
Union summary---yes
Typedef summary---yes
#define summary---yes
Method (Sub/Function) summary-yesyesyes
Method parameters-yesyesyes
Method [in,out] parameters---yes
Method [optional] parameters---yes
Generic Class/Method type-parameters-yesyesyes
Templates and Template type-parameters---yes
Method exceptions thrown-+ (entries are added, but no description is supplied)+ (entries are added, but no description is supplied)yes
Method returns-+ (a few)+ (a few)yes
Property summary-yesyesyes
Property value---yes
Indexer summary-yesyesyes
Indexer value---yes
Events & Event Handlers-yesyesyes
Operator overloads-yesyesyes
Extension methods---yes
Code element declaration support (Doxygen)---yes
Class/Interface <seealse cref='base-class'/> entries-yesyesyes
Overridden method/property <seealso cref='base-method'/> entries---yes

Deriving documentation from existing documentationVSGDGDPAPD
Copy base class method documentation to derived class override-yesyesyes
Copy interface method documentation to derived class implementation-yesyesyes
Copy best-match method documentation to sibling overloaded methods---yes
Copy best-match parameter documentation to parameters in other methods---yes
Copy best-match property documentation to parameters---yes
Copy best-match member variable documentation to parameters---yes

Auto-generation enginesVSGDGDPAPD
Documentation-generation rules0~203~2033217
Abbreviation expansions000607
'of the' reordering-yesyesyes
a/an/the correction---yes
Heuristic and Dictionary-based acronym handling-yesyesyes
Configurable word replacement dictionary---yes
Punctuation correction---yes
Configurable prefix (e.g. 'm_member', 'lpszString', 'IInterface') cleanup---yes
Configurable suffix (e.g. 'value_u32') cleanup---yes

Documentation Block UpdatingVSGDGDPAPD
Easy update (allow cursor to be in lines/comments above the code element to update)---yes
Update comments for all code elements in a Type/File in one pass--yesyes
Update comments for all code elements in a Project in one pass---yes
Update comments for all code elements in a Solution in one pass---yes
Update declaration entries to match edited method signature (Doxygen)---yes
Update 'typeparam' and 'param' entries to match edited method signature-yesyesyes
Update 'returns' entries to match edited method signature---yes
Update 'exception' entries to match exceptions thrown in method---yes
Update property description (gets, sets, gets or sets) to match implementation---yes
Update indexer description (get, set, get or set) to match implementation---yes
Word-wrap user-edited documentation entries---yes
Optionally convert <, >, & into legal XML/HTML entities---yes
Enforce whitespace rules---yes
Enforce user-defined entry ordering---yes
Configurable removal of 'illegal' block elements---yes
Support for custom entry types---yes
Locate auto-generated comments-yesyes-

Documentation Block ConversionsVSGDGDPAPD
Convert regular // comments into documentation comments---yes
Convert end of line ///< or //!< comments into documentation comments---yes
Convert between different block styles and layouts---yes
Convert between DocXML, Doxygen, Javadoc, JSDoc, JSDuck, QDoc and Natural formats---yes
User-editable parsing code to allow conversion of legacy comment blocks---yes

Documentation/Comment Block Live Editing HelpersVSGDGDPAPD
Create a new doc-comment as /// (C#) or ''' (VB) is typedyes--yes
Create a new doc-comment as /// or /** (C++/CLI, C++, C, Java, Unrealscript) is typed---yes
Highlight doc comments with a background fill colour---yes
Leave the cursor in a useful place when a doc comment is createdyes--yes
Continue comment block with correct indentation when newlines are typed---yes
Join comment lines together (stripping prefixes) when deleting newlines---yes
Automatically extend bullet-lists when newlines are typed in comments---yes
Automatically reformat pasted text to integrate it into comments---yes
Optionally navigate between doc entries with tab/shift-tab---yes
Spelling checker--yesyes

Special featuresVSGDGDPAPD
Even works on code that doesn't compile---yes
Rich-text documentation viewer--yesyes
Rich-text documentation editor--yesyes
CHM documentation export--yes-

Generated documentation comparison

Quite a number of add-ins are available that build some form of documentation blocks automatically. However, almost every one of these add-ins provides only the most basic features - typically they provide empty comments, sometimes populated with fixed text for a few specific code elements (such as constructors). Only GhostDoc and Atomineer (to our knowledge) are capable of documenting a wide range of code elements in a context-sensitive manner.

Some typical comments from these two add-ins are shown below, to give a rough idea of the quality of documentation they produce.

public class VehicleDetailsDlg : Form { ... }
summary - (no documentation generated) Dialog for setting the vehicle details.

public float CalcSalesTax(List<float> priceList)
summary Calcs the sales tax. Calculates the sales tax.
priceList The price list. List of prices.
returns - The calculated sales tax.

int NumUsers { get; }
summary Gets the num users. Gets the number of users.
value - The total number of users.

int Min(int value1, int value2, int value3)
summary: Mins the specified value1. Determines the minimum of the given parameters.
value1 The value1. The first value.
value2 The value2. The second value.
value3 The value3. The third value.

public static bool Contains(this string[] textList, string textToFind)
	if (textList.Length == 0)
		throw new InvalidOperationException("textList cannot be empty");
summary Determines whether [contains] [the specified text list]. A string extension method that determines if this collection contains a given object.
Invalid operation exception - Thrown when the requested operation is invalid.
textList The text list. The textList to act on.
textToFind The text to find. The text to find.
returns <c>true</c> if [contains] [the specified text list]; otherwise, <c>false</c> true if the object is in this collection, false if not.

Copyright © 1996-2024 Atomineer. All Rights Reserved. Any trademarks reproduced in this text are the property of their respective owners - Contact us - Company Info