【问题标题】:ASP.NET Core 2.0 Upgrade - Broken NETStandardLibrary ReferencesASP.NET Core 2.0 升级 - 损坏的 NETStandard 库参考
【发布时间】:2018-04-26 21:43:13
【问题描述】:

我最近将我们的 ASP.NET Core 1.1 应用程序升级到了 2.x。此项目(以及解决方案中的所有其他项目)现在针对完整的 4.6.1 框架(以前针对完整的 4.5.2 框架)。 Visual Studio 版本 15.5.7。

这样做后,我在同一解决方案中的所有类库项目都有许多对NETStandard.Library.2.0.2 的损坏/黄色引用。奇怪的是,该解决方案仍然可以毫无问题地构建,并且在构建输出中没有生成相关的警告或错误。所有其他引用都很好,包括 ASP.NET 项目中的 all 引用(意味着该项目没有这个问题)。

有谁知道这里可能发生了什么?

故障排除步骤

  1. 清洁解决方案/重建
  2. NuGet 恢复
  3. 重启 Visual Studio
  4. 删除 .suo/.vs/project.fragment.lock.json 并重启
  5. 暂停/恢复/关闭 R#
  6. 手动删除和重建(有效,但在 NuGet 还原后它们会恢复)
  7. 确认它要查找的文件实际上在路径上可用...它们没有ref 之前的奇怪“双反斜杠”:

环境详情

  • Visual Studio:15.5.7
  • 完整框架:4.6.1
  • dotnet --info:

.NET 命令行工具 (2.1.4)

产品信息:版本:2.1.4 提交 SHA-1 哈希: 5e8add2190

运行时环境:操作系统名称:Windows 操作系统版本:10.0.16299 操作系统平台:Windows RID:win10-x64 基本路径:C:\Program 文件\dotnet\sdk\2.1.4\

Microsoft .NET Core 共享框架主机

版本:2.0.5 构建: 17373eb129b3b05aa18ece963f8795d65ef8ea54

请随时让我知道哪些其他信息可能是相关的。

更新:根据要求提供 CSProj 示例(必须编辑某些内容) https://gist.github.com/mikeomeara1/0edd3b83447473accd3350ffc974c62c

【问题讨论】:

  • 你能分享csproj文件之一的内容吗?
  • 你知道了@NateBarbettini。请参阅更新。
  • 您的 csproj 使用的是旧的标准 csproj 样式。我不确定 Asp .NET Core 2 是否适用于这种样式的 csproj 文件。
  • 那么,这意味着重建它们吗?添加项目 -> 复制文件 -> 重新安装 Nuget 包...等?
  • 另外,你的 Visual Studio 是一个小版本,当前版本是 15.6.7,你在 15.5.7,quite a bit was updated

标签: c# visual-studio asp.net-core .net-core


【解决方案1】:

旧的 .NET Framework 项目系统不能正确支持 .NET Standard Library 2.x,至少在设计时是这样。它需要新的 .NET Core SDK 项目系统。

我最近关注的一个很好的迁移指南 — https://www.natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/

【讨论】:

  • 好吧,这是有道理的,这个项目来自 2015 年,在某个时候被转换为 2017 年。我现在已经升级到当前运行,我现在就这样做并报告。非常感谢,我永远不会自己解决这个问题。
  • 请原谅我没有完全理解这个;当我从 VS 添加一个新的类库项目(.NET 框架)时,我最终得到了一个 .csproj,它具有这个链接所说的旧版本 并且它使用“旧”模式。您是说所有新的 VS 项目都需要属于“.NET Standard”类型吗?不是“.NET Framework”类型来避免我遇到的问题?
  • 别担心——这可能会非常令人困惑,有时工具并没有太大帮助。你说的当然是我的理解。你需要忍受你正在添加一个“.NET Core 类库”项目。然后,您可以重新定位该项目,以针对完整的 .NET Framework。
  • @mikeo 每个使用<Project Sdk="Microsoft.NET.Sdk"> 的项目都不需要是.net 标准或.net 核心。您仍然可以使用具有新格式的完整 dotnet 框架。您只需将目标框架设置为 <TargetFramework>net471</TargetFramework>,这将是一个 .Net 4.7.1 项目。
  • 是的,同意。新的基于 .NET Core SDK 的项目系统不指定目标框架。
【解决方案2】:

@MattBrooks 和 @ScottChamberlain 是正确的,这是一个 Visual Studio csproj 问题,并按照@MattBrooks 提供的链接是此问题的正确答案(我已将其标记为这样) .但是,我也想分享我的个人经验,希望它能帮助其他发现这个过程令人费解和困惑的人(并且将其放入问题的更新中似乎是不正确的)。正如马特所说,“这可能非常令人困惑,有时工具并没有太大帮助。”

这是我用来转换我的项目的确切过程。在尝试手动转换一对之后,我放弃并重建了它们:

  1. 从解决方案中删除项目
  2. 将项目文件夹复制到备份位置
  3. 添加具有相同名称的新“.NET Standard”类库项目
  4. 编辑新的 .csproj 并将 <TargetFramework> 更改为 net461(或您需要的任何内容。请注意,此无法从 Target Framework UI 下拉菜单中完成。您将看到的只是“Net Standard ")。
  5. 从备份项目packages.json 复制所有<package> 元素(如果您没有package.json,请参阅已接受答案的大纲,将您的csproj <References> 转换为<PackageReferences>
  6. 在新的 csproj 中创建 <ItemGroup>
  7. 粘贴到<package> 元素中
  8. 查找替换:
    • <package id= --> <PackageReference Include=
    • targetFramework=".*" --> <blank>
    • version --> Version
  9. 打开备份的 .csproj 并复制所有没有 Version=4.1.0.0, Culture=neutral, PublicKeyToken=..."<Reference Include=...,例如看起来像 <Reference Include="System.Web" /> 并粘贴到新的 csproj 中并保存。
  10. 此时,NuGet 将恢复您的包。
  11. 如果您(可能)最终得到带有黄色/警告三角形的 NuGet 依赖项:
    • 尝试构建并查看错误列表中是否出现任何错误/警告。我有一些版本在项目之间没有变化。显然,现在这是一个句号问题。
    • 我有一些来自私人订阅源的预发布 NuGet 包,我必须手动重新安装。
    • 如果一切都失败了,请从 csproj 中删除引用并直接从 NuGet 安装
    • 如果一切都失败了,请从 VS 包管理器卸载并重新安装包
  12. 将备份项目中的内容文件和文件夹复制到新项目文件夹中 - VS 将拾取它们并自动添加到项目中。对于安装了 NPM 包的项目,我还必须将 node_modules 从备份复制回新项目。
  13. 添加回您可能拥有的任何解决方案项目引用。
  14. 现在,有趣的是,如果您像我一样是个白痴,并且有“从项目中排除”的文件....您必须找到并删除它们。

我还要注意,如果您(像我一样)在您的 csproj 中的软件包中有 <Reference> 标签 package.json,我发现package.json 在具有正确的版本。

无法转换单个 MVC4/WebAPI2 项目,因为新项目格式中似乎没有办法告诉它“这是一个 Web 项目,运行 IIS 并调试”...因为所有新的核心项目都需要 static void Main。不过可能是一个不同的问题。

我能够使用此处提供的答案迁移 MVC4/WebAPI2 应用程序:https://stackoverflow.com/a/49655107/3892531

祝你好运!

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多