在分支转换时出现构建错误:您的项目未引用“.NETFramework,Version=v4.7.2”框架。

63
我们正在使用Git,并且有一个针对完整.NET框架的解决方案。几天前,我开始将解决方案迁移到.NET Core上。不幸的是,出现了一些问题,使我回到主分支(其中包含完整.NET框架的代码)。每当我尝试构建应用程序时,就会出现以下错误:
1>D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\NuGet\15.0\Microsoft.NuGet.targets(186,5): error : 您的项目未引用“.NETFramework,Version=v4.7.2”框架。请在project.json的“frameworks”部分中添加对“。NETFramework,Version = v4.7.2”的引用,然后重新运行NuGet还原。
我尝试过清理nuget packages,运行git reset,但似乎都没有帮助。有什么想法吗?

2
最新的.NET Core长期支持版本(2.1)不再使用project.json,而是采用新格式的.csproj。你使用的是哪个.NET Core版本?csproj文件是什么样子的? - Panagiotis Kanavos
我知道...事实上,那就是我在netcore分支中所拥有的... - Luis Abreu
8个回答

168

当我将一些项目从4.6.2升级到4.7.2时,遇到了类似的问题 - 这在我们的ASP.Net Core解决方案(针对完整框架)以及我们的WPF解决方案中都发生了。

最初似乎是出现错误的项目随机分布,其他近乎相同的csproj的项目构建顺利,而另一些则失败了。消息中的“重新运行NuGet还原”也误导了我(有些项目甚至没有NuGet引用...)

问题似乎源于项目obj文件夹中包含project.assets.json文件,我不确定这是何时生成的 - 可能是过去的遗物,并且清理项目并不能删除它。该文件指向先前的框架,在我的情况下为4.6.2 - 手动删除无法构建的每个项目的bin / obj文件夹,然后重新构建解决此错误。这也可以解释为什么当我为了保持清醒而克隆该存储库时,它也能够构建成功。


这个解决方案可能不适用于使用转换的解决方案 - 对我的解决方案没有起作用,但我能够恢复旧文件夹并回到“较少损坏”的状态。 - ewomack
我有一个单一的解决方案,其中包含一个 .Net Core 3.1 项目和一个 .Net winforms 4.7.2 项目,并且遇到了相同的问题。以下工作流程对我有效:-删除文件夹 obj 和 bin,删除 .Net Core 3.1 项目,重新加载解决方案并编译,添加 .Net Core 项目。 - Steef
2
这发生在我将代码转换为 .NET 的测试分支上,删除所有 /obj 和 /bin 文件夹解决了问题。 - Lavamantis
我长期以来一直面临着同样的问题,感谢您的答案。它立即解决了我的问题。谢谢。 - abhishek
确切地说!这正是我在寻找的。 - Aneeq Azam Khan
显示剩余3条评论

20
通过自定义 Visual Studio Build Event 自动删除非 Core 项目的 project.assets.json 文件来解决此问题。
更新(6/13/2020):删除 project.assets.json 后会导致出现 squiggy lines,因为 Intellisense 需要文件中的引用。因此,更好的解决方法是使用 Pre-build 事件仅在项目不是 .Net Core 时删除该文件。
这可以通过计算机上的 $(TargetFramework) ---> "netcoreapp3.1" 进行识别。您安装的框架可能显示不同的标识符,请相应地更新脚本(请参阅由第 2 行的 ECHO 生成的构建 Output 窗口中的文本)。注意:在某些 .Net Framework 版本上,这可能是一个空字符串,这不应该是一个问题。我们还只比较前 7 个字符以忽略版本,以避免在版本更改时必须更新脚本。
SET _tgt=$(TargetFramework)
ECHO %_tgt%
IF NOT "%_tgt:~0,7%" == "netcore" (
    cd $(ProjectDir)\obj
    DEL project.assets.json
)

在这里输入图片描述

==== 更新(2020年6月13日)结束。以下是原始答案,以提供上下文。 ====

我们将问题缩小到了一个文件:{Your project}/obj文件夹中的project.assets.json。它是由.Net Core项目创建的文件,但在切换到.Net Framework项目后,Visual Studio不会删除它,从而导致OP提到的问题。

解决方法是删除此文件,但我们不必每次需要切换项目时手动删除它,而是在Visual Studio中创建了一个后期构建事件,在每次成功的Core构建之后自动将其删除(如果您在构建之前运行脚本,则无法构建您的Core项目)。您可以自定义脚本以删除您认为有问题的任何文件/文件夹,但我们的问题仅限于该单个文件。

cd $(ProjectDir)\obj
del project.assets.json

注意:如果已经存在有问题的构件,您需要手动删除 一次,因为后构建事件只会在成功构建后运行。

在此输入图片描述


谢谢你追查这个问题。似乎仍然存在。你知道它是否已经被报告给Microsoft了吗? - dashnick

14
  1. 执行git clean -dfX命令- 从工作树中删除未被跟踪的文件。
  2. 重新构建解决方案。

我的日常工作伴侣是VS。因为VS Clean是一个糟糕的清理工具,会把许多垃圾留在电脑里面;-) - juwens

6

MaxJ答案接近了我的情况,但当在一个无法构建的单个项目中这样做并不能修复构建问题时,我必须删除解决方案中每个项目的bin和obj文件夹。

为方便起见,我使用了上述方法。应该只在您不介意删除这些文件夹的文件夹根目录下运行(例如,在前端节点模块可能是不好的)。

gci -Include bin,obj -Recurse | Remove-Item -Force -Recurse

这个答案最终为我解决了问题。删除有问题的项目中的 /bin 和 /obj 文件夹并不足以解决它,但是对解决方案中的每个项目都进行删除就可以了。谢谢! - Paul Smith

5

我删除了项目中的obj和bin文件夹,并重建了项目。Visual Studio自动创建了要再次使用的“dll”文件。这对我起作用了。


2
听起来你可能有一些不兼容Core的库。如果Nuget期望/要求4.7.2,那么很可能仍然有一些项目或库在使用它。如果你恢复Nuget包并清理它们,但问题仍未解决,那么说明你正在恢复的包仍然针对4.7.2。
另外,请问你确定你正在使用最新的项目结构吗?我注意到你的错误信息中包括project.json,这已经被弃用,改用了新的csproj格式;如果相关的话,可以点击这里查看更多信息。我不知道会出现什么情况,导致你收到关于project.json的错误消息,而解决方案中没有project.json文件。

你好。是的,我知道。事实上,在“net core分支”中,我正在使用“csproj sdk”项目文件,所以我真的不知道这里发生了什么。而错误发生在完整的net分支中...最终我删除了所有内容并重新克隆了它...现在看起来似乎正常了...尽管我仍然不明白发生了什么... - Luis Abreu

1
我发现仅使用Agent Ransack在我的repo上搜索project.assets.json并删除这些文件,而不是整个bin和obj文件夹,就可以解决问题 :)

1
我遇到了同样的错误,清理bin/obj文件夹没有起作用。经过长时间的调查,我发现我错误地覆盖了IntermediateOutputPath,使其指向所有项目的同一个目录。这在并行构建期间混淆了NuGet中间文件。将Build.Directory.props修复为在IntermediateOutputPath中包含$(MSBuildProjectName),解决了我的问题。

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