【问题标题】:How to target netcoreapp2.0 and net461 in the same project如何在同一个项目中定位 netcoreapp2.0 和 net461
【发布时间】:2017-10-02 18:47:20
【问题描述】:

我有一个项目,我想使用 .net core 2.0,我相信它是 netcoreapp2.0。它还使用使用 .net 4.6.1 创建的 nuget 包。我可以控制这个 nuget 包,如果需要的话可以改变一些东西。它确实将 netstandards 2.0 作为 nuget 包导入。

如果我包含在我的 cproj 文件中:

    <TargetFramework>netcoreapp2.0</TargetFramework>

我收到此警告:

使用“.NETFramework,Version=v4.6.1”而不是项目目标框架“.NETCoreApp,Version=v2.0”恢复了包“Terryberry.Roes.Common 2017.9.29-mongo”。此软件包可能与您的项目不完全兼容。

以及有关 system.net.sockets 从 4.3 降级到 4.1 的错误。 4.6.1 nuget 包具有 System.Net.Sockets 4.3,所以我不确定它为什么要降级。

具体错误供参考:

检测到的包降级:System.Net.Sockets 从 4.3.0 到 4.1.0。直接从项目中引用包以选择不同的版本。 MyNetCoreProject (>= 2017.2.0) -> Microsoft.VisualStudio.Web.BrowserLink (>= 1.1.2) -> Microsoft.Extensions.FileProviders.Physical (>= 1.1.1) -> NETStandard.Library (>= 1.6. 1) -> System.Net.Sockets (>= 4.3.0) MyNetCoreProject (>= 2017.2.0) -> Microsoft.VisualStudio.Web.BrowserLink (>= 1.1.2) -> System.Net.Sockets (>= 4.1.0) MyNetCoreProject

我尝试同时定位两者:

    <TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>

这给了我这样的警告:

使用“.NETFramework,Version=v4.6.1”而不是项目目标框架“.NETCoreApp,Version=v2.0”恢复包“My461NugetPackage”。此软件包可能与您的项目不完全兼容。

这也让我感到困惑,因为现在我添加了 net461,它说它将使用 .NetCoreApp 构建它

降级 System.Net.Sockets 仍有错误

然后我决定只尝试 net461。只是看看它是否会编译。确实如此,但我得到一个运行时错误。

    <TargetFramework>net461</TargetFramework>

这给了我:

未处理的异常:System.TypeLoadException:来自程序集“Microsoft.AspNetCore.Hosting,版本=1.1.2.0,文化=中性,PublicKeyToken=adb9793829ddae60”的“Microsoft.AspNetCore.Hosting.WebHostBuilder”类型中的方法“ConfigureAppConfiguration”不有一个实现。

我已经尝试进行一些研究,但是随着 .net 核心的发展,那里有很多旧的/过时的信息。我一直无法弄清楚这一点。任何指导将不胜感激。

【问题讨论】:

  • 是否有任何原因阻止您将类库交叉编译到net461netstandard2.0
  • @Tseng 是什么意思?我还不能将 4.6.1 应用程序升级到 .net 核心,这是一个大项目。我肯定会考虑使用 net461 和 netstandard2.0。我只是在 TargetFrameworks 标签中设置这两个吗?
  • 你说:它也是使用.net 4.6.1创建的nuget包,所以问题是,为什么你不能移植/交叉定位它使用 netstandard 2.0,所以我不是在谈论您的应用程序,而是在谈论您引用的库/包。然后您可以在 net461 和 netcoreapp2.0 中引用它,而不会出现任何问题
  • 也许这就是我最终要研究的东西。它有很多东西,将它移植到 netstandard 2.0 可能有它自己的一系列问题。不过,我很感谢您的建议!

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


【解决方案1】:

首先,您不能同时针对两者。它们是相互排斥的。不过,这不是问题,因为您不需要这样做。

您收到的警告是设计使然。它不会阻止您的应用程序运行,也不会真正表明任何问题。就是这样:一个警告。它让您知道您的 .NET Core 项目正在使用一个以 .NET Framework 4.6.1 为目标的库,当且仅当该库利用恰好发生在.NET Standard 2.0 不支持。它只是为了让您了解正在发生的事情,只要您的应用程序的所有功能都正常工作,就可以安全地忽略它。如果警告本身困扰您,您可以简单地取消它。

此警告不仅会在安装包时出现,而且每次构建时都会出现。这样可以确保您不会意外忽略它。

警告的原因是 NuGet 无法知道 .NET Framework 库是否真的可以工作。例如,它可能依赖于 Windows 窗体。为了确保您不会浪费时间对无法解决的问题进行故障排除,NuGet 让您知道您可能会偏离轨道。当然,您必须忽略的警告很烦人。因此,我们建议您测试您的应用程序/库,如果您发现一切正常,您可以取消警告。

来源:Announcing .NET Standard 2.0

【讨论】:

  • 我认为这很有道理,而且很有帮助。我的项目肯定是行不通的。这可能与降级 System.Net.Sockets 的错误有关。我不知道它为什么要这样做
  • 如果您的项目无法运行,则 .NET Framework 库不兼容。由于您控制此包,因此最好的办法是将其定位到 .NET Standard 2.0 并对其进行调整,直到它在此基础上正确构建。然后,在 Core 应用程序中引用它就没有问题了。
  • 好的,我希望有更简单的方法。但我认为你是对的,我找不到其他解决方案。
  • 好吧,运行 .NET Framework 包并不是一个长期的解决方案。这是微软添加的一种便利,因此人们在等待开发人员更新它们时仍然可以使用旧包。 Microsoft 的计划仍然是将所有内容迁移到 .NET Standard,因此您只是领先一步。
【解决方案2】:

不完全是您所要求的,但实现这一点的另一种方法是使用共享库。

这有点复杂,因为您有一个共享库项目(仅包含共享代码文件)和多个其他针对该平台的项目(例如,一个用于 .net 4.6.1,一个用于 .net 2.0 核心,等等)。这种结构的一个优点是,您可以使用特定于平台的代码来扩展项目。

例如,请参阅this repository

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2012-01-01
    • 1970-01-01
    • 2017-06-13
    • 2019-05-04
    相关资源
    最近更新 更多