从.NET Framework 4.5升级到4.6.1后,Nuget重新定向问题

193

我有一个 .net 解决方案,大约有30个项目,所有项目都针对 .Net Framework 4.5,并且每个项目引用了至少3-4个 NuGet 包。

现在我们需要将它们更新到 .Net Framework 4.6.1。所以我需要知道以下内容:

  1. 我需要重新定位 NuGet 包吗?还是可以跳过这一步,因为这将是一个“原地”升级?
  2. 如果是,我是否可以通过替换每个项目的 packages.config 文件中的 targetFramework="net45" 为 targetFramework="net461" 来更新 NuGet 包?我看到一些帖子建议使用 'update-package' 命令进行卸载和重新安装包。我今天尝试了一下,但出现了一些错误。

1
在packages.config文件中修改targetFramework对于项目中引用的程序集没有影响,假设您没有使用.xproj,因此这样做不是正确的更改。我猜测很少有NuGet包明确地针对.NET 4.6,因此我认为不需要重新定位任何内容。您应该能够查看NuGet包的lib目录以查看它们的目标。 - Matt Ward
所以我最终将75%的NuGet包升级到了它们的最新版本。在升级后,大多数包的targetFramework属性自动设置为"net461"。有一些包我稍后会升级,但它们在升级后似乎工作正常。谢谢。 - Vishal
从4.5.*升级到4.*将按设计工作:https://msdn.microsoft.com/zh-cn/library/ff602939%28v=vs.110%29.aspx - OzBob
https://learn.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages - Ohad Schneider
2
很遗憾没有人回答第一个问题。需要这样做吗?如果需要,为什么? - comecme
3个回答

373

这些包不会自动重新定位,但是有一种自动修复方法。

在“程序包管理器控制台”中运行以下命令:

Update-Package -Reinstall

这将强制软件包管理器重新安装每个项目中的每个软件包(不更改引用软件包的版本)。

在将新框架定位后重新安装软件包,这将更改所有引用的软件包到正确的版本。

您也可以对单个项目运行此操作:

Update-Package -Reinstall -ProjectName Project.Name.Here

我已经多次使用这种技术来解决NuGet参考问题。


16
为了加快速度,给这条命令添加一个参数:-IgnoreDependencies,变成这样:Update-Package -Reinstall -IgnoreDependencies。不改变原意,简化语言,使其更容易理解。 - Ken Hundley
12
理论上讲,不同目标的软件包可能有不同的依赖关系,这种情况下使用IgnoreDependencies可能是不明智的。 - Ohad Schneider
2
我可以建议你使用以下方法进行更具体的重新安装:Update-Package Package.Name.Here -Reinstall -ProjectName Project.Name.Here - Can Bud
1
这很棒……直到你运行它与引用预发布软件包的项目相遇。有已知的解决方法吗? - Paul Suart
3
我认为你只需要加上"-IncludePrerelease"标记。 - Ken Hundley
显示剩余3条评论

54

1 查找所有 .csproj 文件并替换

<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>

随着

<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>

打开“包管理器控制台”,然后运行以下命令

Update-Package -Reinstall -IgnoreDependencies

找到所有的解决方案,然后对每个方案进行msbuild编译。


第三步还应自动处理 packages.config 的第二步。 - Ray
@RayVega请再解释一下。您能否编辑并展示一下如何操作? - OzBob
3
如果我跳过第二步而直接在第一步之后立即执行第三步,所有的“packages.config”文件的“targetFramework”属性都会自动修改为与csproj的新“TargetFramework”相匹配。至少,在我的情况下,使用nuget.exe版本4.3.0.440并从4.5升级到4.7时,就是这样运作的。基本上,这为我节省了很多手动编辑每个项目的那些包文件的工作。 - Ray
1
查找和替换功能很好用,但是请仔细检查 web.config 文件中的 <compilation targetFramework="___"> 元素,确保您也进行了更改。 - Glen Little
2
跳过@Ray建议的第二步对我没有用。仅通过重新构建,没有一个packages.config文件被修改。最终我使用了完整的Update-Package -Reinstall命令,这个方法很好用。 - Tobias

5

通过使用 - Update-Package -reinstall 命令进行修复。

enter image description here


2
这个回答对@KenHundley之前的回答没有任何新的补充。 - R. Schreurs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接