【问题标题】:How to force .NET Framewok to use .NET Standard libary in a NuGet package with VS2017如何强制 .NET Framework 在带有 VS2017 的 NuGet 包中使用 .NET Standard 库
【发布时间】:2018-07-06 09:20:23
【问题描述】:

我有一个业务逻辑和 DAL 项目,将此项目称为 A。此库具有 .NET Standard 2.0 作为目标框架。我正在引用 NuGet 包 RavenDB.Client 3.5.4,它使用 NuGet 包的 netstandard1.3 文件夹中的 library/dll。

我有一个目标框架为 .NET Framework 4.7.1 的 ASP.NET Web API 应用程序,调用此项目 B(不使用 .Net Core 2,因为有一些对旧代码的引用不适用于 .网络核心)。

我也有一个 ASP.NET Core 应用,用 .NET Core 2.0 的目标框架调用这个项目 C。

项目 B 和 C 都参考项目 A。

项目 C 可以毫无问题地引用项目 A 和 RaveDB.Client NuGet 包,因为它也使用 netstandard1.3 文件夹中的 library/dll。从 C 调用包 A 中的 BL 或 DAL 时没有问题。

项目 B 可以引用项目 A,但引用 RavenDB.Client NuGet 包引用 net45 文件夹中的包/dll。我收到此错误:

The type 'IDocumentStore' is defined in an assembly that is not referenced.You must add a reference to assembly 'Raven.Client.Lightweight, Version=3.5.4.0, Culture=neutral, PublicKeyToken=null

这首先会产生误导,因为很明显问题出在 Target Framework 上。我参考了 Raven.Client.Raven.Client.Lightweight 版本 3.5.4.0。但我正在将一个从 net45 库构建的对象 (IDcoumentStore) 传递给 netstandard1.3 库。

我的问题,因为 .NET Framework 4.7.1 可以使用 .NET Standard 库,我如何强制 VS2017 中针对 .NET Framework 4.7.1 的项目在 NuGet 包中使用 .NET Standard 库?我尝试将 targetFramework="net471" 更改为 targetFramework="netstandard1.3" 不起作用似乎 VS 或 NuGet 恢复了。

我唯一的解决方案是从 Nuget 包中删除 net45 库,并仅使用 .Netstandard 库推出自己的解决方案。

【问题讨论】:

  • 联系 Raven 软件包开发人员,让他们为您提供解决方案。更改 NuGet 行为超出了您的控制范围,并且您不应该尝试这样做。
  • 好建议,但他们会是唯一遇到此类问题的人吗?如果我遇到另一个具有相同问题的库怎么办,似乎更好的解决方案可以选择使用哪个目标框架。
  • 顺便说一句,你用packages.config吗?您是否尝试改用包引用?
  • 阅读一些文档Package references in project files 的两个问题 1. 文档状态仅适用于 .NET Core 项目、.NET Standard 项目和 UWP 项目 2. 如果确实有效,则没有参数指定目标框架。这与使用 packages.config 时的问题相同
  • 你解决了这个问题吗?我有同样的问题

标签: .net visual-studio-2017 ravendb .net-standard


【解决方案1】:

在 Raven 4.0 客户端中,NuGet 包似乎只包含 .net 标准库。这将解决问题,并且基本上通过重新创建 Raven 3.x 客户端并剥离 net45 文件夹并重新打包来完成我所做的工作。现在我需要做的就是更新到 4.0,这不是一件容易的事。

这回答了 RavenDB 的问题,只是希望我不会遇到混合了完整框架和 .Netstandard 库的其他包,并且我希望我的应用程序针对特定框架而不是为我挑选它。

更新

我认为问题/解决方案存在混淆。我会再试一次。 如果您查看 RavenDB.Client 3.5.5 包,您将看到以下内容。任何具有类似结构的包都会有类似的问题。

\lib \net45 \netstandard1.3

我有一个面向 .NET Standard 2.0 的类库,它将使用 \lib\netstandard1.3 文件夹中的 .NET Standard 1.3 RavenDB 库。我还有一个针对 .NET Framework 4.7.1 的 App 项目。该项目引用了类库和 RavenDB 客户端库。该项目将使用 \net45 文件夹中的 .NET 4.5 库。问题是,当应用程序从类库运行 RavenDB 逻辑时,我收到错误,因为 bin 文件夹中的 RavenDB 库的目标是 .NET 4.5 库,而不是我的类库正在寻找的 .NET Standard 1.3 库。

当我引用 NuGet 包时,我无法指定目标框架。目标框架是根据项目的目标框架推断出来的。即使以 .NET Framework 4.7.1 为目标的项目可以使用 .NET Standard 库或 .NET Framework 库,但我无法选择它为我选择的目标框架。

因为我无法选择目标框架,唯一的方法是通过从 NuGet 包中删除 \net45 文件夹并重新打包它来强制它。然后 .NET Framework 4.7.1 应用程序将使用 .NET Standard 1.3 RavenDB 库。 或者使用 RaveDB 4.0,这更像是一项任务,因为我必须升级服务器并重写一些代码。

如果您查看 RaveDB 4.0 包,它只有 .NET 标准库。因此,为什么它可以在引用 .NET 2.0 标准类库的面向 4.7.1 的项目中工作。

\lib \netstandard1.3 \netstadnard2.0

【讨论】:

  • 这没有提供答案,如果您想添加更多详细信息,请改为编辑您的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多