2009-01-06 7 views
10

Czy ktoś może opublikować makro Visual Studio, które przechodzi przez wszystkie pliki źródłowe C# w projekcie i dodaje baner plików? Dodatkowy kredyt, jeśli działa dla dowolnego typu pliku źródłowego (.cs, .xaml, itp.).Potrzebujesz makra Visual Studio do dodania banera do wszystkich plików C#

+0

VS 2013 ma ładny dodatek z [Rubicon IT] (http://licensemanager.codeplex.com/), która pozwala na dodawanie, usuwanie i aktualizowanie nagłówek do każdego pliku z rodzaj rozszerzenia zadeklarowany w pliku licencji. Zainstaluj bezpośrednio, przechodząc do Narzędzia -> "Rozszerzenia i aktualizacje" -> "Online" -> wyszukaj "nagłówki" i znajdź wynik "Menedżer nagłówka licencji". Teraz kliknij prawym przyciskiem myszy folder projektu i użyj nowego menu nagłówków licencji. –

Odpowiedz

14

Proszę, ja stanowić przykład dla .cs i .Vb ale nie powinno być trudne, aby dostosować go do innego typu pliku potrzebuje: edytowane rekursywnie dodać nagłówek do sub -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

Dziękuję, będę głosował na ten jeden zamiast tego, który ma link do bloga, ponieważ pokazuje, jak wyliczyć projekty. – DSO

+0

Jak dobrze to działa w przypadku plików, które mają projektantów, takich jak WinForms? –

+0

Należy dodać go do dowolnego pliku CS lub VB w roztworze. Który zawiera plik projektanta - jednak tak jak w przypadku każdego "wygenerowanego" pliku, plik może się zmienić, a komentarz może już nie występować. –

5
+0

Wow - świetna odpowiedź. Szkoda, że ​​PO nie wydaje się błądzić Google. –

+5

Dzięki za link. Onorio, wypróbowałem google, ale użyłem słowa "banner" zamiast "header" ... które zwraca zupełnie inne wyniki. Nie wiem dlaczego, zawsze nazywałam je banerami. Oczywiście teraz z powodu tego postu, użycie słowa "banner" zwraca ten sam wpis! – DSO

1

Oto jist niego. Nie, nie debugowałem tego, to jest ćwiczenie dla czytelnika. I robi się to z mojej głowy. (Z wyjątkiem komentera plików ... To jest prawdziwe Makro, którego używam).

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 

wypróbowane i prawdziwe "Flower Box" żmija:

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 

Nadzieja to pomaga, a przynajmniej daje jakieś pomysły. Ponownie, nie testowałem/debugowałem "looper pliku źródłowego", sądzę, że sobie z tym poradzisz.

Larry

Powiązane problemy