2009-01-06 5 views
10

Est-ce que quelqu'un peut publier une macro Visual Studio qui parcourt tous les fichiers source C# dans un projet et ajoute une bannière de fichier? Crédit supplémentaire si cela fonctionne pour n'importe quel type de fichier source (.cs, .xaml, etc).Besoin d'une macro Visual Studio pour ajouter une bannière à tous les fichiers C#

+0

VS 2013 a une belle add-in de (http://licensemanager.codeplex.com/) [rubicon IT] qui vous permet d'ajouter, de supprimer et mettre à jour un en-tête à chaque fichier le type d'extension déclaré dans votre fichier de licence. Installez directement en allant dans Outils -> "Extensions et mises à jour" -> "En ligne" -> recherchez "en-têtes" et trouvez le résultat "Gestionnaire d'en-têtes de licence". Maintenant, faites un clic droit sur votre dossier de projet et utilisez le nouveau menu "en-têtes de licence". –

Répondre

14

Ici, vous allez, je donne un exemple pour .cs et .vb mais ne devrait pas être difficile pour vous adapter à vos autres besoins type de fichier: Edité pour ajouter récursive tête à sous -folders

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 
+0

Merci, je vais voter pour celui-ci au lieu de celui qui a le lien vers le blog, car cela montre comment énumérer les projets. – DSO

+0

À quel point cela fonctionne-t-il pour les fichiers qui ont des concepteurs, comme WinForms? –

+0

Devrait l'ajouter à n'importe quel fichier CS ou VB dans la solution. Ce qui inclurait le fichier du concepteur - cependant, comme avec n'importe quel fichier 'généré', le fichier pourrait changer et votre commentaire pourrait ne plus être là. –

5
+0

Wow - bonne réponse. Dommage que l'OP ne semble pas grok Google. –

+5

Merci pour le lien. Onorio, j'ai essayé google mais j'ai utilisé le mot "bannière" au lieu de "en-tête" ... qui renvoie des résultats totalement différents. Je ne sais pas pourquoi, je les ai toujours appelés des bannières. Bien sûr, maintenant, à cause de ce post, l'utilisation du mot "bannière" renvoie ce même post! – DSO

1

Voici le jist de celui-ci. Non, je n'ai pas débogué cela, c'est un exercice pour le lecteur. Et, ceci est fait du haut de ma tête. (Excepté le commenter de fichier ... C'est une vraie macro que j'utilise).

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 

éprouvé et vrai "Flower Box" aspic

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 

Hope this helps, ou tout au moins vous donne quelques idées. Encore une fois, je n'ai pas testé/déboguer le "fichier source looper", je suppose que vous pouvez gérer cela.

Larry

Questions connexes