在分支之间转换时生成错误:您的项目未引用“ .NETFramework,Version = v4.7.2”框架

时间:2018-07-26 14:32:51

标签: c# .net git build .net-core

我们正在使用Git,我们有一个针对整个网络框架的解决方案。几天前,我已经开始将解决方案迁移到.net core。不幸的是,出现了一些使我回到master分支的问题(该分支具有完整的.NET框架的代码)。每当我尝试构建应用程序时,都会出现以下错误:

  

1> D:\ Program Files(x86)\ Microsoft Visual   Studio \ 2017 \ Community \ MSBuild \ Microsoft \ NuGet \ 15.0 \ Microsoft.NuGet.targets(186,5):   错误:您的项目未引用   “ .NETFramework,Version = v4.7.2”框架。添加参考   您的“框架”部分中的“ .NETFramework,Version = v4.7.2”   project.json,然后重新运行NuGet restore。

我尝试清理nuget软件包,运行git reset,但似乎无济于事。知道发生了什么吗?

8 个答案:

答案 0 :(得分:29)

在将某些项目从4.6.2升级到4.7.2时,我遇到了类似的问题-这既发生在针对完整框架的ASP.Net Core解决方案中,也发生在WPF解决方案中。

最初,似乎是随机项目出现此错误,其他具有几乎完全相同的csproj的项目正在构建中,而其他项目则失败了。消息中的“重新运行NuGet恢复”也使我走错了方向(其中一些项目甚至没有NuGet参考...)

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

答案 1 :(得分:8)

通过自定义Visual Studio 构建事件为非核心项目自动删除project.assets.json,以解决此问题。

更新(2020/6/13) 事实证明,删除project.assets.json会导致显示混乱的行,因为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
)

enter image description here

==== 更新(6/13/2020)到此处结束。原始答案保留在下面以提供上下文。 ====

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

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

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

注意:如果已经存在问题工件,则需要一次手动删除它们,因为构建后事件仅在成功构建后才会运行。

enter image description here

答案 2 :(得分:6)

  1. 调用git clean -dfX-从工作树中删除未跟踪的文件
  2. 重建解决方案

答案 3 :(得分:2)

我删除了obj和bin文件夹并重建了Project。 Visual Studio自动创建了“ dll”文件以供再次使用。 它对我有用。

答案 4 :(得分:1)

听起来像您可能有一些与Core不兼容的库。如果Nuget期望/需要4.7.2,则可能会在您的项目或我冒险尝试的库中针对它。还将说明为什么如果要还原的软件包仍以4.7.2为目标,清理并还原Nuget软件包并不能解决问题。

相关说明,确定要使用最新的项目结构吗?我注意到您的错误消息包含 while go: mail = imaplib.IMAP4_SSL(server) mail.login(email_comp, senha) ,为了支持新的csproj格式,该消息已过时;如果需要,更多信息是here。我不知道您会收到有关project.json的错误消息,而解决方案没有project.json的情况。

答案 5 :(得分:1)

我有同样的错误,bin / obj清理没有帮助。经过长时间的调查,我发现我错误地重写了IntermediateOutputPath,以指向我所有项目的相同目录。这在并行构建过程中弄乱了NuGet中间文件。修复Build.Directory.props以将$(MSBuildProjectName)包含在IntermediateOutputPath中为我解决了这个问题。

答案 6 :(得分:0)

MaxJanswer因情况而异,但是在无法构建的单个项目中,我不得不删除解决方案中每个项目的bin和obj文件夹,修复构建。

为方便起见,我在上面使用的PS仅应在您不介意删除这些文件夹的文件夹的根目录下运行(例如,在前端节点模块中可能是个不好的地方):< / p>

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

答案 7 :(得分:0)

我发现,仅使用Agent Ransack在仓库中搜索project.assets.json,然后删除这些文件,而不是删除整个bin&obj文件夹,就可以了:)