Visual Studio 2008 で自動的にC#.NETのコメント文を生成する

Visual Studio 2008で動作確認しています。
C#.NETでのみ利用できます。

たとえば

before

こんな関数があったとして、このマクロを実行すると

after

こうなります。

Visual Basicのソースを載せます。

Imports System
Imports EnvDTE
Imports System.Diagnostics
Imports Microsoft.VisualBasic
Imports Microsoft.VisualBasic.ControlChars
Imports System.IO
Imports System.Collections.Generic

Public Module addComment

    'コメント書式
    Private Const FORMAT_COMMENT = "-----------------------------------------------------------------------------" & vbCrLf '上下ライン
    Private Const TITLE_COMMENT = "機能            : "    'コメントタイトル
    Private Const METHOD_COMMENT1 = "機能説明        : "  'メソッドタイトル
    Private Const METHOD_COMMENT2 = "                : "
    Private Const PARAM_COMMENT = "引き数          : "
    Private Const RETURN_COMMENT = "返り値          : "
    '------------------'
    'コメント作成マクロ'
    '------------------'
    Public Sub AddComent()
        Dim CodeModel As FileCodeModel      'ファイルコードモデル
        Dim ParentElem As CodeElement       '親エレメント
        Dim NameSpaceElems As CodeElements  '名前空間エレメント
        Dim ClassElem As CodeElement        'クラスエレメント
        Dim i, j, k, l As Integer           'カウント
        Try
            'ファイルコードモデルを取得
            CodeModel = DTE.ActiveDocument.ProjectItem.FileCodeModel
            '見つけたコードエレメント分回す
            For i = 1 To CodeModel.CodeElements.Count
                '親コードエレメントを取得
                ParentElem = CodeModel.CodeElements.Item(i)
                '名前空間エレメントを探す
                If (ParentElem.Kind = vsCMElement.vsCMElementNamespace) Then
                    '名前空間エレメントを取得
                    NameSpaceElems = ParentElem.Children()
                    For j = 1 To ParentElem.Children.Count
                        'クラスエレメントを探す
                        If (ParentElem.Children().Item(j).Kind = vsCMElement.vsCMElementClass) Then
                            'クラスエレメントを取得
                            ClassElem = ParentElem.Children().Item(j)
                            For k = 1 To ClassElem.Children.Count
                                '関数エレメントを探す
                                If (ClassElem.Children().Item(k).Kind = vsCMElement.vsCMElementFunction) Then
                                    '関数コメント作成処理
                                    FunctionComment(CType(ClassElem.Children().Item(k), CodeFunction))
                                    '入れ子のクラス発見
                                ElseIf (ClassElem.Children().Item(k).Kind = vsCMElement.vsCMElementClass) Then
                                    Dim SubClassElem As CodeElement
                                    'サブクラスの取得
                                    SubClassElem = ClassElem.Children().Item(k)
                                    For l = 1 To SubClassElem.Children().Count
                                        '関数エレメントを探す
                                        If (SubClassElem.Children().Item(l).Kind = vsCMElement.vsCMElementFunction) Then
                                            '関数コメント作成処理
                                            FunctionComment(CType(SubClassElem.Children().Item(l), CodeFunction))
                                        End If
                                    Next
                                End If
                            Next
                        End If
                    Next
                End If
            Next
        Catch ex As NotImplementedException
            MsgBox(ex.ToString())
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
    '--------------------'
    '関数コメント作成処理'
    '--------------------'
    Private Sub FunctionComment(ByVal codeFunc As CodeFunction)
        Dim Comment As String   'コメント本体
        Dim i As Integer        'カウント
        'アクセス指定子 public の時
        Comment = FORMAT_COMMENT & TITLE_COMMENT & vbCrLf & METHOD_COMMENT1 + vbCrLf + METHOD_COMMENT2 + vbCrLf
        '引数の個数を取得
        Dim ParamCount = codeFunc.Parameters.Count
        '引き数あり
        If (ParamCount > 0) Then
           '引き数の情報を取得
            For i = 1 To ParamCount
                Dim pName As String     ' 型名
                '引き数名を取得
                Dim ParamName = codeFunc.Parameters.Item(i).Name
                '引き数の型の取得
                Dim ParamElem = codeFunc.Parameters.Item(i)
                pName = ParamElem.Type.AsString
                '省略型名の取得
                GetOmissionName(pName)
                If (i = 1) Then
                    Comment &= PARAM_COMMENT & pName & " " & ParamName & " - " & vbCrLf & vbCrLf
                Else
                    Comment &= METHOD_COMMENT2 & pName & " " & ParamName & " - " & vbCrLf & vbCrLf
                End If
            Next
            '引き数なし
        Else
            Comment &= PARAM_COMMENT & "なし" & vbCrLf
        End If
        '返り値の情報を取得
        Dim ReturnElem = codeFunc.Type
        '返り値型名を取得
        Dim RetTypeName = ReturnElem.AsString
        '返り値void 型は無しにする
        If (RetTypeName = "void") Then
            Comment &= RETURN_COMMENT & "なし" & vbCrLf
        Else
            Comment &= RETURN_COMMENT & RetTypeName & " - " & vbCrLf & vbCrLf
        End If
        'タグコメントを拾うためポイント作成
        Dim point As EditPoint = codeFunc.StartPoint.CreateEditPoint()
        '一行上に
        point.LineUp()
        '確認用文字列
        Dim temp As String = point.GetText(3)
        'タグコメント(///<>///)あり
        If (temp = "///") Then
            Return
        End If
        'コメント(//)あり 
        If (codeFunc.Comment.Length <> 0) Then
            If (Mid(temp, 1, 2) <> "//") Then
                '正しい関数コメントではない
                temp = codeFunc.Comment
                point = codeFunc.StartPoint.CreateEditPoint()
                Dim commentPoint As EditPoint
                Dim j, max As Integer
                max = 200
                'コメント初期化
                codeFunc.Comment = ""
                'コメント入れる
                codeFunc.Comment = Comment & FORMAT_COMMENT
                '200行以上,上は無視する
                For j = 1 To max
                    point.LineUp()
                    '元コメント探す
                    If (point.FindPattern("//")) Then
                        Exit For
                    End If
                Next
                If (j >= max) Then
                    Throw New Exception("Error" & vbCrLf & "関数名 : " & codeFunc.Name & "のコメント作成に失敗しました。")
                End If
                point.LineUp()
                point.EndOfLine()
                point.Insert("		// " & temp)
            End If
        Else
            'そのままコメント入れる
            codeFunc.Comment = Comment & FORMAT_COMMENT
        End If
    End Sub
    '------------------'
    '型名の省略を行う。'
    '------------------'
    Private Sub GetOmissionName(ByRef name As String)
        Dim list() As String = name.Split(".")
        If (list.Length) Then
            name = list(list.Length - 1)
        End If
    End Sub
End Module

5,6年前のソースなので理解出来ずで、説明は割愛します。
すいません(´ω`;)