Необходимость макроса Visual Studio для добавления баннера во все файлы С#

Может ли кто-нибудь опубликовать макрос Visual Studio, который проходит через все исходные файлы С# в проекте и добавляет баннер файла? Дополнительный кредит, если он работает для любого типа исходного файла (.cs,.xaml и т.д.).

Ответ 1

Здесь вы приводите пример для .cs и .vb, но вам не должно быть сложно настроить его на другие типы файлов: Отредактировано для рекурсивного добавления заголовка в подпапки

Sub IterateFiles()
    Dim solution As Solution = DTE.Solution
    For Each prj As Project In solution.Projects
        IterateProjectFiles(prj.ProjectItems)
    Next
End Sub

Private Sub IterateProjectFiles(ByVal prjItms As ProjectItems)
    For Each file As ProjectItem In prjItms
        If file.SubProject IsNot Nothing Then
            AddHeaderToItem(file)
            IterateProjectFiles(file.ProjectItems)
        ElseIf file.ProjectItems IsNot Nothing AndAlso file.ProjectItems.Count > 0 Then
            AddHeaderToItem(file)
            IterateProjectFiles(file.ProjectItems)
        Else
            AddHeaderToItem(file)
        End If
    Next
End Sub

Private Sub AddHeaderToItem(ByVal file As ProjectItem)
    DTE.ExecuteCommand("View.SolutionExplorer")
    If file.Name.EndsWith(".cs") OrElse file.Name.EndsWith(".vb") Then
        file.Open()
        file.Document.Activate()

        AddHeader()

        file.Document.Save()
        file.Document.Close()
    End If
End Sub

Private Sub AddHeader()
    Dim cmtHeader As String = "{0} First Line"
    Dim cmtCopyright As String = "{0} Copyright 2008"
    Dim cmtFooter As String = "{0} Footer Line"

    Dim cmt As String

    Select Case DTE.ActiveDocument.Language
        Case "CSharp"
            cmt = "//"
        Case "Basic"
            cmt = "'"
    End Select
    DTE.UndoContext.Open("Header Comment")
    Dim ts As TextSelection = CType(DTE.ActiveDocument.Selection, TextSelection)
    ts.StartOfDocument()
    ts.Text = String.Format(cmtHeader, cmt)
    ts.NewLine()
    ts.Text = String.Format(cmtCopyright, cmt)
    ts.NewLine()
    ts.Text = String.Format(cmtFooter, cmt)
    ts.NewLine()
    DTE.UndoContext.Close()
End Sub

Ответ 3

Вот его суть. Нет, я не отлаживал это, это упражнение для читателя. И это делается с моей головы. (За исключением комментатора файлов... Это настоящий макрос, который я использую).

function CommentAllFiles
    option explicit

    Dim ActiveProjectFullName
    Dim dte80 As EnvDTE80.Solution2

    ActiveProjectFullName = dte80.Projects.Item(0).FullName
    If ActiveProjectFullName = "" Then
        MsgBox("No project loaded!")
        Exit Sub
    End If

    Err.Number = 0
    doc.Open(ActiveProjectFullName, "Text", True)
    If Err.Number <> 0 Then
        MsgBox("Open " + ActiveProjectFullName + " failed: " & Hex(Err.Number))
        Exit Sub
    End If

    ActiveDocument.Goto(1, 1, vsMovementOptions.vsMovementOptionsMove)

    ' Build search string
    Dim SearchString
    Dim vsFindOptionsValue As Integer
    SearchString = "^SOURCE=.*" + dn + "$"

    while ActiveDocument.Selection.FindText(SearchString, vsFindOptions.vsFindOptionsFromStart + vsFindOptions.vsFindOptionsRegularExpression)
        Dim TheFile
        TheFile = ActiveDocument.Selection.Text
        TheFile = Mid(TheFile, 8)
        doc.Open(TheFile)
    wend
    ActiveDocument.Close()
end function

Пробужденный и истинный сумматор "Цветочная коробка":

    Function IsClassDef()
    Dim ColNum
    Dim LineNum
    Dim sText

    sText = ActiveDocument.Selection.ToString()
    If sText = "" Then
        'ActiveDocument.Selection.WordRight(dsExtend)
        'sText = ActiveDocument.Selection
        'sText = ucase(trim(sText))
    End If

    If (sText = "CLASS") Then
        IsClassDef = True
    Else
        IsClassDef = False
    End If
End Function

Sub AddCommentBlock()
    'DESCRIPTION: Add Commecnt block to header, CPP files and Class Defs
    AddCPPFileDesc()
End Sub

Sub AddCPPFileDesc()
    'DESCRIPTION: Add File desc block to the top of a CPP file
    Dim selection As EnvDTE.TextSelection
    ActiveDocument.Selection.StartOfLine()

    Dim editPoint As EnvDTE.EditPoint
    selection = DTE.ActiveDocument.Selection()
    editPoint = selection.TopPoint.CreateEditPoint()

    Dim bOk, sExt, IsCpp, IsHdr, sHeader, IsCSharp
    bOk = True
    IsCpp = False
    IsCSharp = False

    If ActiveDocument.Selection.CurrentLine > 10 Then
        If MsgBox("You are not at the top of the file. Are you sure you want to continue?", vbYesNo + vbDefaultButton2) = vbNo Then
            bOk = False
        End If
    End If

    If (bOk) Then
        sExt = ucase(right(ActiveDocument.Name, 4))
        IsCpp = sExt = ".CPP"
        IsHdr = Right(sExt, 2) = ".H"
        IsCSharp = sExt = ".CS"

        If (IsCpp) Then
            sHeader = left(ActiveDocument.Name, len(ActiveDocument.Name) - 3) + "h"
            FileDescTopBlock(1)
            editPoint.Insert("#include " + Chr(34) + "StdAfx.h" + Chr(34) + vbLf)
            editPoint.Insert("#include " + Chr(34) + sHeader + Chr(34) + vbLf)
        ElseIf (IsCSharp) Then
            FileDescTopBlock(1)
        Else
            If IsHdr Then
                'If IsCLassDef() Then
                'AddClassDef()
                'Else
                AddHeaderFileDesc()
                'End If
            Else
                FileDescTopBlock(1)
            End If
        End If
    End If
End Sub

Sub AddHeaderFileDesc()
    FileDescTopBlock(0)
    Dim selection As EnvDTE.TextSelection
    ActiveDocument.Selection.StartOfLine()

    Dim editPoint As EnvDTE.EditPoint
    selection = DTE.ActiveDocument.Selection()
    editPoint = selection.TopPoint.CreateEditPoint()
    editPoint.Insert("#pragma once" + vbLf)
End Sub


Sub FileDescTopBlock(ByVal HasRevHistory)
    'DESCRIPTION: Add File desc block to the top of a CPP file
    Dim selection As EnvDTE.TextSelection

    ActiveDocument.Selection.StartOfLine()
    ActiveDocument.Selection.EndOfLine()
    Dim sComment
    sComment = ActiveDocument.Selection.ToString()
    If Left(sComment, 2) = "//" Then
        ActiveDocument.Selection.Delete()
        sComment = LTrim(Mid(sComment, 3))
    Else
        sComment = ""
    End If

    Dim sLineBreak
    Dim sFileName
    Dim sBlock
    sLineBreak = "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
    sFileName = ActiveDocument.Name

    ActiveDocument.Selection.StartOfDocument()
    sBlock = sLineBreak & vbLf & _
            "//  File   : " & sFileName & vbLf & _
           "//  Author : Larry Frieson" & vbLf & _
          "//  Desc   : " & sComment & vbLf & _
         "//  Date   : " & CStr(Now.Date()) & vbLf & _
        "//" & vbLf & _
       "//  Copyright © 20" + Right(CStr(Now.Year.ToString()), 2) + " MLinks Technologies. All rights reserved" + vbLf
    If (HasRevHistory > 0) Then
        sBlock = sBlock & _
                "//" & vbLf & _
               "//  Revision History: " & vbLf & _
              "//    " & CStr(Now) & " created." & vbLf & _
             "// " & vbLf
    End If
    sBlock = sBlock + sLineBreak + vbLf

    Dim editPoint As EnvDTE.EditPoint
    selection = DTE.ActiveDocument.Selection()
    editPoint = selection.TopPoint.CreateEditPoint()
    editPoint.Insert(sBlock)

End Sub

Надеюсь, что это поможет или, по крайней мере, дает вам некоторые идеи. Опять же, я не тестировал/отлаживал "петлитель исходного файла", я полагаю, вы можете справиться с этим.

Larry