ASP.NET Core 2.0升级 - 破坏NETStandardLibrary参考

时间:2018-04-26 21:43:13

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

我最近将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项目中的所有引用(意味着项目没有此问题)。

enter image description here

有谁知道这里会发生什么?

疑难解答步骤

  1. 清洁解决方案/重建
  2. NuGet Restore
  3. 重新启动Visual Studio
  4. 删除.suo / .vs / project.fragment.lock.json并重新启动
  5. 暂停/恢复/关闭R#
  6. 手动删除并重建(可在NuGet恢复后恢复工作)
  7. 确认它所寻找的文件在路径上实际可用...他们在ref之前没有出现奇怪的“双反斜杠”:
  8. enter image description here

    环境详情

    • 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核心共享框架主机

         

    版本:2.0.5构建:   17373eb129b3b05aa18ece963f8795d65ef8ea54

    请随时告诉我其他相关信息。

    更新:根据请求的CSProj示例(有些事情需要编辑) https://gist.github.com/mikeomeara1/0edd3b83447473accd3350ffc974c62c

2 个答案:

答案 0 :(得分:2)

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

我最近关注的良好迁移方法 - https://www.natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/

答案 1 :(得分:1)

@MattBrooks和@ScottChamberlain是正确的,这是一个Visual Studio csproj问题,并且链接@MattBrooks提供是这个问题的正确答案(我已将其标记为这样)。但是,我也希望与大家分享我的个人经验,希望它能帮助那些发现这个过程令人费解和困惑的人(而且将这个问题转化为对问题的更新似乎并不正确)。正如马特所说,“它可能非常令人困惑,有时工具也无济于事。”

以下是我用来转换项目的确切步骤。在尝试手动转换一对夫妇后,我放弃并重建了它们:

  1. 从解决方案中删除项目
  2. 将项目文件夹复制到备份位置
  3. 添加具有相同名称的新“.NET标准”类库项目
  4. 编辑新的.csproj并将<TargetFramework>更改为net461(或者您需要的任何内容。请注意,无法通过Target Framework UI下拉列表完成。您将看到的只是“净标准“)。
  5. 复制备份项目<package>中的所有packages.json元素(如果您没有package.json,请参阅接受的答案中的大纲,将您的csproj <References>转换为{ {1}})
  6. 在新csproj中创建<PackageReferences>
  7. 粘贴<ItemGroup>元素
  8. 查找替换:
    • <package> - &gt; <package id=
    • <PackageReference Include= - &gt; targetFramework=".*"
    • <blank> - &gt; version
  9. 打开备份.csproj并复制所有Version没有<Reference Include=...例如Version=4.1.0.0, Culture=neutral, PublicKeyToken=..."看起来像<Reference Include="System.Web" />并粘贴到新的csproj并保存。
  10. 此时,NuGet将恢复您的包裹。
  11. 如果您(可能)最终得到具有黄色/警告三角形的NuGet依赖项:
    • 尝试构建并查看错误列表中是否有任何错误/警告。我有一些版本在项目之间没有jive。显然现在这是一个完整的问题。
    • 我从私人Feed中获得了一些Pre-Release NuGet包,我必须手动重新安装。
    • 如果所有其他方法都失败了,请从csproj中删除引用并直接从NuGet
    • 安装
    • 如果其他所有其他方法都失败,请从VS Package Manager卸载并重新安装软件包
  12. 将备份项目中的内容文件和文件夹复制到新项目文件夹 - VS将启动它们并自动添加到项目中。我还必须将具有从备份安装的NPM软件包的项目复制node_modules回到新项目中。
  13. 添加您可能拥有的任何解决方案项目参考。
  14. 现在,有趣的部分,如果你像我这样的白痴,并且有“被排除在项目之外”的文件......你必须将它们追捕并移除它们。
  15. 我还要注意,如果您(像我一样)在csproj a <Reference>中的包中有package.json个标签,我发现package.json在准确版本方面是准确的。

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

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

    祝你好运!