我在Visual Studio 2012中有一个解决方案,其中包含170个C#项目。我需要将所有项目从.NET Framework 4.0重新定位到4.5.2。
我更喜欢让Visual Studio通过进入每个项目的属性,更改目标框架以及让Visual Studio对.csproj文件进行必要的更改来处理这个问题。
我注意到这些更改包括向.csproj添加一些新的XML标记,具体取决于当前项目的某些属性。
如何在不使用替换文本工具替换目标版本号的情况下批量重新定位所有170个C#项目?我希望Visual Studio能够进行所有必要的标签修改和添加,并且单独更换将不允许这种情况发生。
答案 0 :(得分:72)
MSDN文档" Migration Guide to the .NET Framework 4.5"和" How to Configure an App to Support .NET Framework 4 or 4.5"只讨论修改项目。没有关于立即对整个解决方案应用更改的详细信息,也没有在VS中看到支持它的功能。
但是,Visual Studio库中提供了一个名为Target Framework Migrator的(评级良好)扩展,它支持升级到4.5.2(以及更新的版本**)并且看起来像#&# 39;我会做你想要的。如果您有兴趣,可以在GitHub上找到源代码。
请注意,缺少此类功能可能是故意的(而不仅仅是遗漏)。我只是在猜测,但也许MS只会计算需要的项目新的Frameworks将会升级。 FWIW,如果你最终升级了一些与其他解决方案共享的项目,那么这些解决方案可能无法构建,直到他们 升级。
话虽这么说,如果你只是一个(或几个)解决方案在一个小商店,而你想要一次性升级所有东西,那么上述工具也许适合你。
**最近还没有很多发展。如果您无法使用较新的.NET Framework版本,请检查现有的PRs和Issues是否有修复。例如,有人发布了fix for .NET Framework v 4.7.1。希望这些最终会合并。
答案 1 :(得分:6)
我已经构建了一个简单的工具来迁移整个解决方案的目标框架版本,因为Target Framework Migrator Extension不支持Visual Studio 2017.从我的GitHub存储库https://github.com/Xpitfire/TargetFrameworkMigrator
下载该工具我知道这不是最好的方式,但它对我有用,也许它也会帮助别人。
答案 2 :(得分:3)
由于 Target Framework Migrator 损坏,我进行了自己的搜索/替换(使用git bash,在Windows上可以正常运行);基本上,它将 v4.6.x 更改为 v4.7.2 ,然后使用臭名昭著的DOS的CRLF将文件转换回使用:
find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
-exec grep -Z -l 'v4\.6\..' \{} \; | xargs -0 sed -i 's/v4\.6\../v4.7.2/'
find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
-exec grep -Z -l 'v4\.7\..' \{} \; | xargs -0 unix2dos
答案 3 :(得分:3)
Target Framework Migrator非常有用。默认情况下,版本为v4.7。但是,添加对v4.7.1,v4.7.2和v4.8的支持很容易。
在C:\ Users {用户名} \ AppData \ Local \ Microsoft \ VisualStudio \文件夹中找到Frameworks.xml文件,然后通过添加以下框架版本进行编辑:
<Framework Id="262152" Name=".NETFramework,Version=v4.8"/>
<Framework Id="262663" Name=".NETFramework,Version=v4.7.2"/>
<Framework Id="262407" Name=".NETFramework,Version=v4.7.1"/>
重新启动Visual Studio之后,您将看到新版本。
答案 4 :(得分:0)
public void ChangeFramework() {
//Add Reference to envdte (Assemblies\Extensions\envDTE)
string SolutionFile = @"C:\MyProject\MyProject.sln";
string ProjectName = "MyProject";
//------------------------------------------------------------------------
//Find the Program ID from the registry for VisualStudio.DTE
//Look it up In Registry: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes
System.Type oType = System.Type.GetTypeFromProgID("VisualStudio.DTE", true);
EnvDTE.DTE dte = (EnvDTE.DTE)Activator.CreateInstance(oType, true);
//------------------------------------------------------------------------
//Open your Solution
dte.Solution.Open(SolutionFile);
//------------------------------------------------------------------------
//Now In your solution go through what is listed in dte.Solution.Projects
//and find the one that match what you want to change target for
int iItemsCount = dte.Solution.Projects.Count;
string sCurrent = "";
for (int i = 1; i <= iItemsCount; i++) {
sCurrent = dte.Solution.Projects.Item(i).Name;
if (dte.Solution.Projects.Item(i).Name == ProjectName) {
//Once you find your project, Change the Framework
EnvDTE.Project oProject = dte.Solution.Projects.Item(i);
oProject.Properties.Item("TargetFrameworkMoniker").Value = ".NETFramework,Version = v4.6.2";
}
}
//------------------------------------------------------------------------
//Close your Solution
dte.Solution.Close();
}
答案 5 :(得分:0)
对于.NET Framework解决方案,一个简单的“ 替换文件 ”对我有用:
eg :从 .NET Framework 4.5.2 到 .NET Framework 4.7.2
在 package.config 文件中,替换所有
targetFramework="net452"
到
targetFramework="net472"
在 *。csproj 文件中,替换所有
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
到
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>