将解决方案中的所有项目重新定位到 .NET 4.5.2

Posted

技术标签:

【中文标题】将解决方案中的所有项目重新定位到 .NET 4.5.2【英文标题】:Retargeting All Projects in a Solution to .NET 4.5.2 【发布时间】:2015-04-10 17:52:24 【问题描述】:

我在 Visual Studio 2012 中有一个解决方案,其中包含 170 个 C# 项目。我需要将所有项目从 .NET Framework 4.0 重新定位到 4.5.2。

我更喜欢让 Visual Studio 处理这个问题,方法是进入每个项目的属性,更改目标框架,并让 Visual Studio 对 .csproj 文件进行任何必要的更改。

我注意到这些更改包括向 .csproj 添加一些新的 XML 标记,具体取决于当前项目的某些属性。

如何在不使用替换文本工具替换目标版本号的情况下批量重定向所有 170 个 C# 项目?我希望 Visual Studio 进行所有必要的标记修改和添加,单独替换不会允许这种情况发生。

【问题讨论】:

我不知道有什么方法可以自动执行此操作。我认为您最好的选择是使用键盘命令的标准 Windows 宏记录器。但是,我会在一段时间而不是尝试将它们批处理在一起,因为在所有情况下可能很难确定 VS 何时完成其工作。 不,你不应该这样做。 特别是不是 4.5.2,它没有有用的新类型,并且不太可能被未来的多目标包覆盖。就像 4.0x 不是一样。一次做这个一个项目,并且只做那些需要它的项目。您实际上想要添加新的参考程序集并修改代码以使用它们的那些。如果您想忽略此建议,您可能会这样做,然后使用 Edit > Find and Replace > Replace in Files 来替换 *.csproj 文件中的 TargetFrameworkVersion 元素。确保您的源代码控制是可靠的。 @HansPassant 根据我的问题,您的查找/替换解决方案正是我不想做的。我需要一个更强大的解决方案。 @GrantWinney 我 /know/ 它不起作用,因为我已经尝试过 Find/Replace,如果您使用该方法,那么 Visual Studio 本来会执行的其他 .csproj 更改将不会实现。 @GrantWinney 目标框架迁移器扩展正是我想要的。如果您可以创建答案,我会将其标记为正确。谢谢! 【参考方案1】:

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(以及更新的版本**)并且看起来完全可以满足您的需求想。如果您有兴趣,可以在GitHub 上找到源代码。

请注意,缺少此类功能可能是故意的(而不仅仅是遗漏)。我只是在猜测,但也许 MS 认为只有需要新框架的项目才会升级。 FWIW,如果您最终升级了一些与其他解决方案共享的项目,那么这些解决方案可能无法构建,直到它们也升级。

话虽如此,如果您在一家只有一个(或几个)解决方案的小商店,并且希望一次性升级所有内容,那么上述工具可能适合您。


多年来一直没有这方面的开发,显然开发者没有计划向其他人发送pass the baton。

如果您无法使其与较新的 .NET Framework 版本一起使用,请检查现有的 PRs 和 Issues 以获取修复,但您可能必须自己应用它们。例如,有人发布了fix for .NET Framework v 4.7.1。希望这些会合并,但我不会屏住呼吸。

如果其他人看到与 Anas 相同的错误(在 cmets 中),几周前的 here's a GitHub issue 和 2017 年的 another possibly related issue。考虑竖起大拇指并添加更多详细信息,如果你有相同的问题。

【讨论】:

“目标框架迁移器”工具在最新的 VS 2017 更新 15.5.5 上失败,“参数无效” 今天使用 VS2017 15.7 到 Framework 4.7 为我工作 我非常怀疑 MS 会故意省略功能以使用户受益……更有可能只是他们没有考虑或不需要支持的其他东西……通过它进入社区.. @Grant 我对现有问题添加了评论。实际上,我在项目和配置文件中进行了 find/sed 搜索和替换。 开发者在 2019 年 12 月通过了接力棒,您可以再次编辑您的(好的)答案 :)【参考方案2】:

对于 .NET Framework 解决方案,一个简单的“替换文件”对我有用:

例如:从 .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>

【讨论】:

在 VS 2019 中,“全部替换”不太有效。您必须反复使用“查找下一个”。这是我最后一个基于 Microsoft 的开发项目。我正在迁移到 MacOSX,那里的产品具有一致性和不错的 QA 水平。 更改 packages.config 中的 targetFramework 不会重新安装该框架的包,因此您最终可能会得到错误的版本。您必须重新安装该软件包,或者至少删除您的软件包文件夹并恢复该软件包的正确版本。问题在于旧的 packages.config 模型,如果不重新安装,您对包的 dll 引用将针对包的错误子目录中的错误 dll。 哇,假期结束后再次回到这个问题,并且看到有必要对这个相同的答案发表评论,哈哈。我要补充一点,*.csproj 和 packages.config 文件并不是唯一引用目标框架的东西。在各个部分的 web.config 文件中也有参考。例如,在 system.web 下,compile 和 httpRuntime 标记具有需要更新的 targetFramework 属性。因此,这种“查找和替换”手动过程似乎是一个非常糟糕的想法,可能会使您的项目处于不一致和损坏的状态。【参考方案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

【讨论】:

我找到了这个,然后Update-Package -ReInstall 创造了奇迹。谢谢! 这对我来说非常好。感谢您提供此解决方案 PowerShell 版本见***.com/a/2837891/463425【参考方案4】:

我自己构建了一个简单的工具来迁移整个解决方案的目标框架版本,因为目标框架迁移器扩展不支持 Visual Studio 2017。从我的 GitHub 存储库https://github.com/Xpitfire/TargetFrameworkMigrator 下载该工具

我知道这不是最好的方法,但它对我有用,也许它也会帮助其他人。

【讨论】:

现在可以肯定了。 讽刺的是,这是用 Java 构建的。 ?【参考方案5】:

Target Framework Migrator 非常有用。默认情况下,它达到 v4.7。但是,添加对 v4.7.1、v4.7.2 和 v4.8 的支持很容易。

在 C:\Usersusername\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 后,您将看到新版本。

【讨论】:

有一个带有 VS2019 兼容版本的分支,已在 github.com/Ian1971/TargetFrameworkMigrator/releases 更新 非常感谢!这是一个非常好的和简单的解决方法! 更新项目目标框架后,您应该重新安装所有 nuget 包。 VS 会告诉你,但你也可以检查一下:(docs.microsoft.com/en-us/nuget/consume-packages/…)【参考方案6】:
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();

【讨论】:

以上是关于将解决方案中的所有项目重新定位到 .NET 4.5.2的主要内容,如果未能解决你的问题,请参考以下文章

从 .Net 4.0 到 4.5 的重定向解决方案 - 如何重定向 NuGet 包?

目标 .NET 4.0 但需要 .NET 4.5

.Net 4.5 标准中的 SAML 2.0 协议支持

Visual Studio 2022 不支持 .NET Framework 4.5 项目的解决办法

安装了 .NET 4.5 的构建服务器能否成功地将针对 4.0 的项目部署到仅安装了 .NET 4.0 的服务器?

.NET 4.5 中的 Websocket