代码之家  ›  专栏  ›  技术社区  ›  Sam Saffron James Allen

在VS2010中是否有允许它在项目文件更改后恢复打开的文件的设置?

  •  24
  • Sam Saffron James Allen  · 技术社区  · 14 年前

    如果我有10个文件打开,我会修改我的 csproj 文件(例如:添加 空间 )Visual Studio投诉:

    The project "XYZ" has been modified outside the environment. 
    
    Press Reload to load the updated project from disk.
    Press Ignore to ignore the external changes. The change will be used the next time you open the project. 
    

    现在,我真的很想 再装填 因为有一些重要的变化,但我有 希望Visual Studio关闭所有打开的文件,而不是刷新仍存在的文件并关闭丢失的文件。

    有什么方法可以获得这种功能吗?

    3 回复  |  直到 9 年前
        1
  •  28
  •   Scott Hanselman    12 年前

    是的,我在vs10和vs11中编写了一个扩展来解决这个问题: http://visualstudiogallery.msdn.microsoft.com/6705affd-ca37-4445-9693-f3d680c92f38

    享受。

        2
  •  11
  •   Sam Saffron James Allen    14 年前

    由于没有构建此功能,因此我编写了以下宏:

    Public Sub ReloadProject()
        Dim oldFiles As List(Of String)
        oldFiles = New List(Of String)
    
        Dim projName = DTE.ActiveDocument.ProjectItem.ContainingProject.Name
    
        For iDoc = DTE.Documents.Count To 1 Step -1
            Dim name = (DTE.Documents.Item(iDoc).FullName)
            oldFiles.Add(name)
            DTE.Documents.Item(iDoc).Close(vsSaveChanges.vsSaveChangesPrompt)
        Next
    
        Dim projPath As String = DTE.Solution.Properties.Item("Name").Value.ToString() & "\" & projName
    
        Dim solutionExplorer As Window = DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer)
        solutionExplorer.Activate()
    
        Dim solutionHierarchy As UIHierarchy = solutionExplorer.Object
        Dim obj As Object = solutionHierarchy.GetItem(projPath)
        obj.Select(vsUISelectionType.vsUISelectionTypeSelect)
    
        DTE.ExecuteCommand("Project.UnloadProject")
        DTE.ExecuteCommand("Project.ReloadProject")
    
        oldFiles.Reverse()
        For Each file In oldFiles
            Dim item = DTE.Solution.FindProjectItem(file)
            If Not item Is Nothing Then
                item.Open()
                item.Document.Activate()
            End If
        Next
    
    End Sub
    

    当我看到烦人的窗口告诉我重新加载时,我忽略了它。然后在重新加载后运行此宏。

        3
  •  0
  •   NYCdotNet    10 年前

    由于宏在Visual Studio 2013中不可用,因此需要一个外接程序来运行宏。视觉指挥官(在美术馆里)似乎能做到这一点。我通过视觉指挥官调整了山姆·萨弗隆的宏,使其在2013年的VS中发挥作用。

    编辑日期:2015年2月: 我还改进了它,以记住活动文档的行号和列,并将任何错误记录到Visual Studio宏输出窗口中。

    此处显示最新版本: https://gist.github.com/nycdotnet/947025d922fa2af87d03

    '===============================================================================
    ' This macro originally written by Sam Saffron, adapted for Visual Studio 2013
    '  by Steve Ognibene.  Run in Visual Studio with a macro launcher such as the
    '  Visual Commander extension.
    ' Latest version will be here: https://gist.github.com/nycdotnet/947025d922fa2af87d03
    ' Original Stack Overflow thread: http://stackoverflow.com/questions/3783648/is-there-a-setting-in-vs-2010-that-will-allow-it-to-recover-open-files-after-a-p/28130299#28130299
    '===============================================================================
    Imports EnvDTE
    Imports EnvDTE80
    Imports Microsoft.VisualStudio.Shell
    Imports VisualCommanderExt
    Imports System
    Imports System.Collections.Generic
    
    Public Class C
        Implements ICommand
    
        Private DTE as DTE2
    
        Sub Run(InboundDTE As DTE2, package As Package) Implements ICommand.Run
            Me.DTE = InboundDTE
            ReloadProject(DTE)
        End Sub
    
        Public Sub ReloadProject(DTE As DTE2)
            Try
    
                Dim oldFiles As New List(Of String)
                Dim iDoc As Object
    
                If DTE.ActiveDocument Is Nothing Then
                    WriteOutput("You must have a document open to reload a project with this macro.")
                    Exit Sub
                End If
    
                Dim projName = DTE.ActiveDocument.ProjectItem.ContainingProject.Name
    
                Dim activeDocFullName = DTE.ActiveDocument.FullName
                Dim objSel As TextSelection = DTE.ActiveDocument.Selection
                Dim objActive As VirtualPoint = objSel.ActivePoint
                Dim intOriginallyActiveRowNumber As Integer = objActive.Line
                Dim intOriginallyActiveColumnNumber As Integer = objActive.LineCharOffset
    
                For iDoc = DTE.Documents.Count To 1 Step -1
                    Dim name = (DTE.Documents.Item(iDoc).FullName)
                    oldFiles.Add(name)
                    DTE.Documents.Item(iDoc).Close(vsSaveChanges.vsSaveChangesPrompt)
                Next
    
                Dim projPath As String = DTE.Solution.Properties.Item("Name").Value.ToString() & "\" & projName
    
                Dim solutionExplorer As Window = DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer)
                solutionExplorer.Activate()
    
                Dim solutionHierarchy As UIHierarchy = solutionExplorer.Object
                Dim obj As Object = solutionHierarchy.GetItem(projPath)
                obj.Select(vsUISelectionType.vsUISelectionTypeSelect)
    
                DTE.ExecuteCommand("Project.UnloadProject")
                DTE.ExecuteCommand("Project.ReloadProject")
    
                oldFiles.Reverse()
    
                're-open all previously open files
                For Each file As Object In oldFiles
                    Dim item = DTE.Solution.FindProjectItem(file)
                    If Not item Is Nothing Then
                        item.Open()
                        item.Document.Activate()
                    End If
                Next
    
                'reactivate previously active file
                For Each file As Object In oldFiles
                    If file = activeDocFullName Then
                        Dim item = DTE.Solution.FindProjectItem(file)
                        If Not item Is Nothing Then
                            item.Document.Activate()
                            Dim ts as TextSelection = item.Document.Selection
                            ts.MoveToLineAndOffset(intOriginallyActiveRowNumber,intOriginallyActiveColumnNumber,false)
                        End If
                    End If
                Next
            Catch Ex as Exception
                WriteOutput("Exception: " & ex.Message & System.Environment.NewLine & ex.StackTrace)
            End Try
    
        End Sub
    
        Private Function GetMacroOutputPane() As OutputWindowPane
            Dim ow As OutputWindow = _
                DTE.Windows.Item(Constants.vsWindowKindOutput).Object()
    
            Dim outputPane As OutputWindowPane
    
            Try
                outputPane = ow.OutputWindowPanes.Item("Macros")
            Catch ex As Exception
                outputPane = ow.OutputWindowPanes.Add("Macros")
            End Try
    
            Return outputPane
        End Function
    
        Private Sub WriteOutput(ByVal s As String)
            Dim buffer = New System.Text.StringBuilder
    
            buffer.Append(Date.Now.ToLongTimeString())
            buffer.Append(" ")
            buffer.Append(s)
            buffer.Append(System.Environment.NewLine)
    
            Dim output As String = buffer.ToString()
            Dim outputPane As OutputWindowPane = GetMacroOutputPane()
    
            outputPane.OutputString(output)
        End Sub
    
    End Class