回答
你可以做到這一點用在CodeProject斯科特·多爾曼的可用的Visual Studio宏:
下面是代碼,將其下載到您的<UserProfile>\Documents\Visual Studio 2010\Projects\VSMacros80\MyMacros
文件夾,打開在Visual Studio宏IDE( Alt-F11)並將其作爲現有項目添加到「MyMacros」項目中:
'------------------------------------------------------------------------------
' Visual Studio 2008 Macros
'
' ProjectUtilities.vb
'
'------------------------------------------------------------------------------
' Copyright (C) 2007-2008 Scott Dorman ([email protected])
'
' This library is free software; you can redistribute it and/or
' modify it under the terms of the Microsoft Public License (Ms-PL).
'
' This library is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' Microsoft Public License (Ms-PL) for more details.
'------------------------------------------------------------------------------
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Public Module ProjectUtilities
Private Class ProjectGuids
Public Const vsWindowsCSharp As String = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
Public Const vsWindowsVBNET As String = "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}"
Public Const vsWindowsVisualCPP As String = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"
Public Const vsWebApplication As String = "{349C5851-65DF-11DA-9384-00065B846F21}"
Public Const vsWebSite As String = "{E24C65DC-7377-472B-9ABA-BC803B73C61A}"
Public Const vsDistributedSystem As String = "{F135691A-BF7E-435D-8960-F99683D2D49C}"
Public Const vsWCF As String = "{3D9AD99F-2412-4246-B90B-4EAA41C64699}"
Public Const vsWPF As String = "{60DC8134-EBA5-43B8-BCC9-BB4BC16C2548}"
Public Const vsVisualDatabaseTools As String = "{C252FEB5-A946-4202-B1D4-9916A0590387}"
Public Const vsDatabase As String = "{A9ACE9BB-CECE-4E62-9AA4-C7E7C5BD2124}"
Public Const vsDatabaseOther As String = "{4F174C21-8C12-11D0-8340-0000F80270F8}"
Public Const vsTest As String = "{3AC096D0-A1C2-E12C-1390-A8335801FDAB}"
Public Const vsLegacy2003SmartDeviceCSharp As String = "{20D4826A-C6FA-45DB-90F4-C717570B9F32}"
Public Const vsLegacy2003SmartDeviceVBNET As String = "{CB4CE8C6-1BDB-4DC7-A4D3-65A1999772F8}"
Public Const vsSmartDeviceCSharp As String = "{4D628B5B-2FBC-4AA6-8C16-197242AEB884}"
Public Const vsSmartDeviceVBNET As String = "{68B1623D-7FB9-47D8-8664-7ECEA3297D4F}"
Public Const vsWorkflowCSharp As String = "{14822709-B5A1-4724-98CA-57A101D1B079}"
Public Const vsWorkflowVBNET As String = "{D59BE175-2ED0-4C54-BE3D-CDAA9F3214C8}"
Public Const vsDeploymentMergeModule As String = "{06A35CCD-C46D-44D5-987B-CF40FF872267}"
Public Const vsDeploymentCab As String = "{3EA9E505-35AC-4774-B492-AD1749C4943A}"
Public Const vsDeploymentSetup As String = "{978C614F-708E-4E1A-B201-565925725DBA}"
Public Const vsDeploymentSmartDeviceCab As String = "{AB322303-2255-48EF-A496-5904EB18DA55}"
Public Const vsVSTA As String = "{A860303F-1F3F-4691-B57E-529FC101A107}"
Public Const vsVSTO As String = "{BAA0C2D2-18E2-41B9-852F-F413020CAA33}"
Public Const vsSharePointWorkflow As String = "{F8810EC1-6754-47FC-A15F-DFABD2E3FA90}"
End Class
'' Defines the valid target framework values.
Enum TargetFramework
Fx40 = 262144
Fx35 = 196613
Fx30 = 196608
Fx20 = 131072
End Enum
'' Change the target framework for all projects in the current solution.
Sub ChangeTargetFrameworkForAllProjects()
Dim project As EnvDTE.Project
Dim clientProfile As Boolean = False
Write("--------- CHANGING TARGET .NET FRAMEWORK VERSION -------------")
Try
If Not DTE.Solution.IsOpen Then
Write("There is no solution open.")
Else
Dim targetFrameworkInput As String = InputBox("Enter the target framework version (Fx40, Fx35, Fx30, Fx20):", "Target Framework", "Fx40")
Dim targetFramework As TargetFramework = [Enum].Parse(GetType(TargetFramework), targetFrameworkInput)
If targetFramework = ProjectUtilities.TargetFramework.Fx35 Or targetFramework = ProjectUtilities.TargetFramework.Fx40 Then
Dim result As MsgBoxResult = MsgBox("The .NET Framework version chosen supports a Client Profile. Would you like to use that profile?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo, "Target Framework Profile")
If result = MsgBoxResult.Yes Then
clientProfile = True
End If
End If
For Each project In DTE.Solution.Projects
If project.Kind <> Constants.vsProjectKindSolutionItems And project.Kind <> Constants.vsProjectKindMisc Then
ChangeTargetFramework(project, targetFramework, clientProfile)
Else
For Each projectItem In project.ProjectItems
If Not (projectItem.SubProject Is Nothing) Then
ChangeTargetFramework(projectItem.SubProject, targetFramework, clientProfile)
End If
Next
End If
Next
End If
Catch ex As System.Exception
Write(ex.Message)
End Try
End Sub
'' Change the target framework for a project.
Function ChangeTargetFramework(ByVal project As EnvDTE.Project, ByVal targetFramework As TargetFramework, ByVal clientProfile As Boolean) As Boolean
Dim changed As Boolean = True
If project.Kind = Constants.vsProjectKindSolutionItems Or project.Kind = Constants.vsProjectKindMisc Then
For Each projectItem In project.ProjectItems
If Not (projectItem.SubProject Is Nothing) Then
ChangeTargetFramework(projectItem.SubProject, targetFramework, clientProfile)
End If
Next
Else
Try
If IsLegalProjectType(project) Then
SetTargetFramework(project, targetFramework, clientProfile)
Else
Write("Skipping project: " + project.Name + " (" + project.Kind + ")")
End If
Catch ex As Exception
Write(ex.Message)
changed = False
End Try
End If
Return changed
End Function
'' Determines if the project is a project that actually supports changing the target framework.
Function IsLegalProjectType(ByVal proejct As EnvDTE.Project) As Boolean
Dim legalProjectType As Boolean = True
Select Case proejct.Kind
Case ProjectGuids.vsDatabase
legalProjectType = False
Case ProjectGuids.vsDatabaseOther
legalProjectType = False
Case ProjectGuids.vsDeploymentCab
legalProjectType = False
Case ProjectGuids.vsDeploymentMergeModule
legalProjectType = False
Case ProjectGuids.vsDeploymentSetup
legalProjectType = False
Case ProjectGuids.vsDeploymentSmartDeviceCab
legalProjectType = False
Case ProjectGuids.vsDistributedSystem
legalProjectType = False
Case ProjectGuids.vsLegacy2003SmartDeviceCSharp
legalProjectType = False
Case ProjectGuids.vsLegacy2003SmartDeviceVBNET
legalProjectType = False
Case ProjectGuids.vsSharePointWorkflow
legalProjectType = False
Case ProjectGuids.vsSmartDeviceCSharp
legalProjectType = True
Case ProjectGuids.vsSmartDeviceVBNET
legalProjectType = True
Case ProjectGuids.vsTest
legalProjectType = False
Case ProjectGuids.vsVisualDatabaseTools
legalProjectType = False
Case ProjectGuids.vsVSTA
legalProjectType = True
Case ProjectGuids.vsVSTO
legalProjectType = True
Case ProjectGuids.vsWCF
legalProjectType = True
Case ProjectGuids.vsWebApplication
legalProjectType = True
Case ProjectGuids.vsWebSite
legalProjectType = True
Case ProjectGuids.vsWindowsCSharp
legalProjectType = True
Case ProjectGuids.vsWindowsVBNET
legalProjectType = True
Case ProjectGuids.vsWindowsVisualCPP
legalProjectType = True
Case ProjectGuids.vsWorkflowCSharp
legalProjectType = False
Case ProjectGuids.vsWorkflowVBNET
legalProjectType = False
Case ProjectGuids.vsWPF
legalProjectType = True
Case Else
legalProjectType = False
End Select
Return legalProjectType
End Function
'' Sets the target framework for the project to the specified framework.
Sub SetTargetFramework(ByVal project As EnvDTE.Project, ByVal targetFramework As TargetFramework, ByVal clientProfile As Boolean)
Dim currentTargetFramework As TargetFramework = CType(project.Properties.Item("TargetFramework").Value, TargetFramework)
Dim targetMoniker As String = GetTargetFrameworkMoniker(targetFramework, clientProfile)
Dim currentMoniker As String = project.Properties.Item("TargetFrameworkMoniker").Value
If currentMoniker <> targetMoniker Then
Write("Changing project: " + project.Name + " from " + currentMoniker + " to " + targetMoniker + ".")
project.Properties.Item("TargetFrameworkMoniker").Value = targetMoniker
project.Properties.Item("TargetFramework").Value = targetFramework
Else
Write("Skipping project: " + project.Name + ", already at the correct target framework.")
End If
End Sub
Function GetTargetFrameworkMoniker(ByVal targetFramework As TargetFramework, ByVal clientProfile As Boolean) As String
Dim moniker As String = ".NETFramework,Version=v"
Select Case targetFramework
Case ProjectUtilities.TargetFramework.Fx20
moniker += "2.0"
Case ProjectUtilities.TargetFramework.Fx30
moniker += "3.0"
Case ProjectUtilities.TargetFramework.Fx35
moniker += "3.5"
Case ProjectUtilities.TargetFramework.Fx40
moniker += "4.0"
End Select
If clientProfile Then
moniker += ",Profile=Client"
End If
Return moniker
End Function
'' Writes a message to the output window
Sub Write(ByVal s As String)
Dim out As OutputWindowPane = GetOutputWindowPane("Change Target Framework", True)
out.OutputString(s)
out.OutputString(vbCrLf)
End Sub
'' Gets an instance of the output window
Function GetOutputWindowPane(ByVal Name As String, Optional ByVal show As Boolean = True) As OutputWindowPane
Dim win As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
If show Then win.Visible = True
Dim ow As OutputWindow = win.Object
Dim owpane As OutputWindowPane
Try
owpane = ow.OutputWindowPanes.Item(Name)
Catch e As System.Exception
owpane = ow.OutputWindowPanes.Add(Name)
End Try
owpane.Activate()
Return owpane
End Function
End Module
您可以使用宏來做到這一點,或者記住VS項目文件是文本文件,這意味着簡單的全局搜索和替換可以達到相同的效果,並且是對大量項目文件進行相同更改的更一般技術。
首先備份現有的項目文件,然後進行所需的更改(例如更改目標框架)。使用WinDiff或WinMerge將新項目文件與備份進行比較。這會告訴你你需要做的改變。然後使用Visual Studio IDE的「在文件中查找和替換」功能對所有項目文件進行更改。
對於未指定目標框架的項目文件(例如,最初在VS 2005中創建的文件),簡單的搜索和替換將會失敗。對於這樣的項目文件,你必須找到正確的位置來插入一個更復雜的搜索和替換表達式的目標框架元素。 – 2010-06-02 10:20:21
我認爲到目前爲止最簡單的方法是使用搜索和替換工具。如果它支持正則表達式,這是一個優勢。
必須有相當多的在那裏 - 我測試的第一個工作對我來說,雖然:http://www.ecobyte.com/replacetext/
有一張紙條寫着這對Win7的一些問題,但我沒有體驗到。
該工具步驟說明:
- 更換|添加組| |將其命名(例如「MyGroup」)
- 右鍵單擊MyGroup |添加文件(S)...
- 選擇你的來源(例如使用文件夾,瀏覽到您要更改項目的根文件夾)
- 套裝包含文件過濾器,如果有必要(例如,* .csproj的)
- 右鍵單擊原始文本|下面的行高級編輯...
- 在搜索文本下面的下拉框搜索中的文本框(如
<TargetFrameworkVersion>.*</TargetFrameworkVersion>
) 選擇
- 「正則表達式檢索」中輸入您的正則表達式
- 輸入替換文本(如
<TargetFrameworkVersion>4.0</TargetFrameworkVersion>
) 選擇
- 目的地和備份設置(將默認創建一個備份)
- 開始更換(按Ctrl + R)
現在,如果由於某種原因,你需要做到這一點的代碼,我可能會是ABL e也這樣做(這是我發現這個問題的方式)。在這種情況下,請在評論中提出要求。
好吧,我剛剛閱讀ShellShocks答案下的0xA3的評論。我想這可能是一個問題。在嘗試編碼解決方案之前,我會嘗試爲它提供一個正則表達式。 – 2012-10-29 16:55:11
Conditional regexes都讓我頭疼。所以這裏是一個搜索/替換的編碼解決方案(我儘可能避免EnvDTE)。
Order does not seem to matter的項目文件中的條目:
嘗試類似的規定:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace TextReplaceDemo
{
class Program
{
static void Main(string[] args)
{
try
{
ReplaceTargetFrameworkVersion("v4.0", "c:/projekt/2005", "*.csproj");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
/// <summary>
/// Inserts the denoted targetFramework into all occurrences of TargetFrameworkVersion.
/// If the TargetFrameworkVersion is not present in the file, the method searches for the
/// OutputType tag, which should be present, and inserts the TargetFrameworkVersion before that.
/// </summary>
/// <param name="targetFramework">New target framework (e.g. "v4.0")</param>
/// <param name="rootDirectory">Root directory for the file search (e.g. "c:\Projects\2005")</param>
/// <param name="fileSearchPattern">Pattern to find the project files (e.g. "*.csproj).
/// Will get all files for empty parameter.</param>
public static void ReplaceTargetFrameworkVersion(string targetFramework, string rootDirectory, string fileSearchPattern)
{
if (string.IsNullOrEmpty(targetFramework)) throw new ArgumentNullException("targetFramework");
if (string.IsNullOrEmpty(rootDirectory)) throw new ArgumentNullException("rootDirectory");
if (string.IsNullOrEmpty(fileSearchPattern)) fileSearchPattern = "*.*";
string regexPattern = "<TargetFrameworkVersion>.*</TargetFrameworkVersion>";
string insertText = string.Format("<TargetFrameworkVersion>{0}</TargetFrameworkVersion>", targetFramework);
string alternativeMarker = "<OutputType>";
// get all files
List<FileInfo> files = GetAllFiles(rootDirectory, fileSearchPattern);
// iterate over found files
foreach (var file in files)
{
string fileContent = File.ReadAllText(file.FullName);
Match match = Regex.Match(fileContent, regexPattern);
string newfileContent = null;
if (match.Success)
{
// replace <TargetFrameworkVersion>
newfileContent = fileContent.Replace(match.Value, insertText);
}
else if (fileContent.Contains(alternativeMarker))
{
// create <TargetFrameworkVersion>
newfileContent = fileContent.Replace(alternativeMarker,
insertText + Environment.NewLine + " " + alternativeMarker);
}
// overwrite file
if (newfileContent != null)
File.WriteAllText(file.FullName, newfileContent);
}
}
/// <summary>
/// Recursive function to find all files in a directory by a searchPattern
/// </summary>
/// <param name="path">Path to the root directory</param>
/// <param name="searchPattern">Pattern for the file search, e.g. "*.txt"</param>
public static List<FileInfo> GetAllFiles(string path, string searchPattern)
{
List<FileInfo> files = new List<FileInfo>();
DirectoryInfo dir = new DirectoryInfo(path);
if (dir.Exists)
{
// get all files in directory
files.AddRange(dir.GetFiles(searchPattern));
// get all files of subdirectories
foreach (var subDir in dir.GetDirectories())
{
files.AddRange(GetAllFiles(subDir.FullName, searchPattern));
}
}
return files;
}
}
}
PowerShell腳本,我用來做我的。無可否認的是,布魯斯的力量。
Get-ChildItem . -Recurse -Filter *.*proj |ForEach {
$content = Get-Content $_.FullName
$content |ForEach {
$_.Replace("<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>", "<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>")
} |Set-Content $_.FullName
}
很好,但在我的系統上,我收到一個錯誤'script1.ps1無法加載,因爲在此係統上禁用了運行腳本。有關更多信息,請參閱about_Execution_Policies',所以我運行命令'set-executionpolicy remotesigned'來解決這個問題。 – Kuncevic 2013-01-16 04:15:48
Yessirree,bigb。無法在系統上默認運行腳本是一種我認爲理所當然的麻煩。感謝您指出了這一點。對於所有你們都'Set-ExecutionPolicy RemoteSigned'允許你運行本地的PowerShell腳本而不需要對它們進行證書籤名。有關詳細信息,請參閱此處:http://technet.microsoft.com/en-us/library/ee176961.aspx – 2013-01-16 17:34:43
這正是我一直在尋找的。最優雅和靈活的解決方案來更改所有這些.proj文件。 – 2015-03-02 11:15:48
剛剛發佈Target Framework Migrator時,Visual Studio擴展爲改變多個.NET項目目標框架一次
沒有爲我工作。仍然必須手動編輯。 – 2013-10-09 15:52:20
2013年還沒有打球。 – 2013-10-21 09:15:28
vsixmanifest在VS 2013中只需要一個版本號更改 – 2013-11-01 10:05:54
目標框架遷移由帕維爾Samokha(VHQLabs)
http://visualstudiogallery.msdn.microsoft.com/47bded90-80d8-42af-bc35-4736fdd8cd13
就像2015年的魅力一樣! – 2017-05-25 06:23:12
總是有簡單。像notepad ++這樣的像樣的文本編輯器將包含查找/替換文件功能。只要搜索當前版本字符串在你的csproj/vbproj文件:
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
,並用新的版本替換
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
好主意來看看第一,但...
這是我發現的最好的方式,我用Sublime改變了所有 – 2015-10-19 15:44:03
從慶典:
$find . -name "*.csproj" -exec sed -b -i "s,<TargetFrameworkVersion>[^<]*</TargetFrameworkVersion>,<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>," {} \;
作品的魅力! – Max 2016-09-26 15:26:29
- 1. 在Visual Studio 2008中更改目標框架爲我所有的項目3.5
- 2. 用於生成Visual Studio解決方案/項目的API /框架
- 3. Visual Studio解決方案和項目
- 4. 在Visual Studio解決方案中設置所有項目的運行時庫
- 5. Visual Studio 2010 Professional解決方案/項目與Visual Studio 2010 Premium解決方案/項目100%兼容嗎?
- 6. 如何更改Visual Studio 2012中現有Windows Forms項目的目標框架?
- 7. Visual Studio 2010:爲解決方案中的所有項目設置NDEBUG
- 8. 修改解決方案,不從Visual Studio外部加載項目
- 9. Visual Studio 2010中的目標框架沒有更改
- 10. 如何搜索它包含的所有項目的Visual Studio解決方案?
- 11. Visual Studio解決方案中的文件夾或項目?
- 12. Visual Studio解決方案中的項目順序
- 13. Visual Studio 2012中的解決方案項目參考策略
- 14. Visual Studio 2005/2008中的解決方案項目
- 15. visual studio解決方案(WPF XAML)中的樣式項目?
- 16. 獲取Visual Studio中的解決方案項目文件外接
- 17. 解決方案文件與Visual Studio中的項目文件
- 18. Visual Studio Extensibility,你如何枚舉解決方案中的項目?
- 19. 在Visual Studio 2005中調試多項目(C++)解決方案
- 20. Visual Studio 2008在解決方案中切換活動項目
- 21. 在多項目中鏈接問題Visual Studio 2005解決方案
- 22. 如何在Visual Studio 2010中創建C++項目/解決方案?
- 23. 無法在Visual Studio 2010中創建項目或解決方案
- 24. 我該如何將項目/解決方案的目標框架從4.0更改爲3.5?
- 25. 找到解決方案中所有項目的所有參考
- 26. 解決方案項目跨越Visual Studio中的幾個Web項目
- 27. 我的Visual Studio 2005的解決方案有時不能打開整個項目
- 28. SQL Server Management Studio解決方案vs Visual Studio項目
- 29. 爲Visual Studio解決方案的命名約定和項目
- 30. Visual Studio 2010的多項目解決方案添加
+1代碼,因爲CodeProject上的鏈接似乎不再工作。 – Hannele 2012-09-28 18:12:00