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


96

我在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何时完成其工作。
Erik Funkenbusch

1
不,您不应该这样做。 尤其是不是4.5.2,它没有有用的新类型,并且不太可能被将来的多目标包所涵盖。就像不是4.0倍。一次执行一个项目,只执行需要它的项目。您实际上要在其中添加新参考程序集并修改代码以使用它们的程序集。如果您想忽略此建议,则可以这样做,然后使用“编辑”>“查找和替换”>“在文件中替换”替换* .csproj文件中的TargetFrameworkVersion元素。确保您的源代码管理可靠。
汉斯·帕桑

1
@HansPassant根据我的问题,您不希望执行的查找/替换解决方案。我需要一个更强大的解决方案。
Kyle V.

@GrantWinney我/知道/将不起作用,因为我已经尝试过查找/替换,并且如果您使用该方法,则Visual Studio否则会执行其他.csproj更改,但未实现。
Kyle V.

1
@GrantWinney Target Framework Migrator扩展完全符合我的要求。如果您可以创建答案,我将其标记为正确。谢谢!
Kyle V.

Answers:


84

MSDN文档“ .NET Framework 4.5迁移指南 ”和“ 如何配置应用程序以支持.NET Framework 4或4.5 ”仅讨论修改项目。没有关于立即将更改应用于整个解决方案的详细信息,也没有看到VS中支持该功能的功能。

但是,Visual Studio画廊中提供了一个(评级很高的)扩展,称为Target Framework Migrator,它支持升级到4.5.2(以及较新的版本**),并且看起来可以完全满足您的要求。如果您有兴趣,可以在GitHub找到源代码。

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

话虽这么说,如果您在一家只有一个(或几个)解决方案的小商店中,并且希望一次升级所有产品,那么上述工具也许对您有用。


多年来一直没有任何开发,并且显然开发人员没有计划将指挥棒传递给其他任何人。

如果无法使它与更新的.NET Framework版本一起使用,请检查现有的PR问题以获得修复,但您可能必须自己应用它们。例如,某人发布了.NET Framework v 4.7.1修复程序。希望这些将合并,但我不会屏住呼吸。

如果有人看到与Anas相同的错误(在评论中),这是几周前的GitHub问题,以及2017年的另一个可能相关的问题。如果遇到相同的问题,请考虑一下并增加更多详细信息。


7
“目标框架迁移器”工具在最新的VS 2017更新15.5.5上失败,“参数无效”
Anas Ghanem

1
今天为我工作的是VS2017 15.7至Framework 4.7
Tod

我非常怀疑MS是否会故意省略一些功能,以使用户受益……更多的可能是他们没有想到或不需要支持的其他东西……将其传递给社区
。–

1
@Grant我对现有问题添加了评论。我实际上是通过查找/ sed搜索来完成这项工作的,并替换为项目和配置文件。
JB。和莫妮卡

2
开发人员于2019年12月通过了接力棒,您可以再次编辑(好的)答案:)
Ludovic Feltz

12

对于.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>

1
在VS 2019中,“全部替换”效果不佳。您必须反复使用“查找下一个”。这是我最后一个基于Microsoft的开发项目。我要转到MacOSX,在MacOSX上对其产品进行一致性和质量检查。
ATL_DEV

1
更改packages.config中的targetFramework不会重新安装该框架的软件包,因此您仍然可能得到错误的版本。您必须重新安装该软件包,或者至少删除您的packages文件夹并恢复该软件包的正确版本。问题在于旧的packages.config模型,无需重新安装,您是该程序包的dll引用将针对该程序包错误子目录中的错误dll。
Triynko

3
哇,休假后再次回到这个问题,还看到有必要对这个答案发表评论,哈哈。我还要补充一点,*。csproj和packages.config文件不是引用目标框架的唯一内容。web.config文件的各个部分中也有引用。例如,在system.web下,compilation和httpRuntime标记具有需要更新的targetFramework属性。因此,这种“查找和替换”手动过程似乎是一个非常糟糕的主意,可能会使您的项目处于不一致和损坏的状态。
Triynko

9

由于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

4
我找到了,然后Update-Package -ReInstall做了一个奇迹。谢谢!
Askrich

1
这对我来说很好。谢谢您的解决方案
Maryam

有关
Powershell


3

目标框架迁移器非常有用。默认情况下,版本为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之后,您将看到新版本。


3
有一个叉瓦特/一个已经在更新VS2019兼容的版本github.com/Ian1971/TargetFrameworkMigrator/releases
斯科特

非常感谢!这是一个非常简单的解决方法!
合并

2
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();
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.