Visual studio 需要Visual Studio宏向所有C#文件添加横幅

Visual studio 需要Visual Studio宏向所有C#文件添加横幅,visual-studio,Visual Studio,是否有人可以发布一个Visual Studio宏,该宏将遍历项目中的所有C#源文件并添加一个文件标题?如果它适用于任何类型的源文件(.cs、.xaml等),则会获得额外的积分。以下是它的jist。不,我没有调试这个,这是给读者的练习。而且,这是在我的头顶上完成的。(除了文件注释器…我使用的是一个真正的宏) 希望这有帮助,或者至少给你一些想法。同样,我没有测试/调试“源文件循环器”,我想你可以处理它 Larry在这里,我为.cs和.vb提供了一个示例,但您可以根据其他文件类型的需要对其进行调整:编

是否有人可以发布一个Visual Studio宏,该宏将遍历项目中的所有C#源文件并添加一个文件标题?如果它适用于任何类型的源文件(.cs、.xaml等),则会获得额外的积分。

以下是它的jist。不,我没有调试这个,这是给读者的练习。而且,这是在我的头顶上完成的。(除了文件注释器…我使用的是一个真正的宏)

希望这有帮助,或者至少给你一些想法。同样,我没有测试/调试“源文件循环器”,我想你可以处理它


Larry

在这里,我为.cs和.vb提供了一个示例,但您可以根据其他文件类型的需要对其进行调整:编辑以递归地将标题添加到子文件夹中


哇,回答得很好。太糟糕了,这篇文章似乎没有引起谷歌的兴趣。谢谢你的链接。小野,我试过谷歌,但用了“横幅”这个词而不是“标题”。。。结果完全不同。不知道为什么,我一直叫他们横幅。当然,现在因为这篇文章,使用“横幅”这个词返回这篇文章!谢谢,我将投票支持这个,而不是有博客链接的,因为这显示了如何枚举项目。这对有设计器的文件(如WinForms)效果如何?应该将它添加到解决方案中的任何CS或VB文件中。这将包括设计器文件-但是与任何“生成”文件一样,该文件可能会更改,并且您的评论可能不再存在。这正是我所寻找的!但宏不会深入到子文件夹中,并向其中包含的文件添加标题。如果我找到一个解决方案,将发布修改后的代码。VS 2013有一个很好的外接程序,允许您添加、删除和更新每个文件的头,扩展名类型在许可证文件中声明。通过转到“工具”->“扩展和更新”->“联机”->搜索“标题”并找到结果“许可证标题管理器”,直接安装。现在只需右键单击项目文件夹并使用新的“许可证标题”菜单。
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
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