在.NET Framework中使用.NET标准库和Windows兼容包

时间:2018-01-17 20:46:28

标签: c# .net-core-2.0 .net-standard-2.0 .net-4.7.1

我正在努力将一大堆库迁移到最终支持.NET Core的方向。目前,一切都基于.NET Framework。我有一组由几个Web应用程序使用的库项目。

计划是将库项目转换为.NET Standard 2.0,以便基于.NET Framework(版本4.7.1)的网站和新的.NET Core(版本2.0)网站都可以使用它们。我已经做了一些测试解决方案,证明可以做到这一点。

要将第一个库转换为.NET Standard,我必须利用Windows兼容包来获得一些不属于.NET Standard的功能。必须将某些功能(如SqlClient和某些System.Drawing工具)导入到库中。所有这一切都有效但在尝试将我的库带入仍然以.NET Framework为目标的代码时出现了一个问题。

即使名称空间相同,消费代码也看不到对象(例如Image或SqlConnection),除非我将相同的Windows兼容包库添加到使用项目中。如果有的话,我希望这会导致问题,因为我现在在不同的程序集中有两个相同的类(相同的命名空间和对象名)。幸运的是,它正在发挥作用。至少单元测试仍在通过。

这是Windows兼容包库的工作方式吗?我曾希望他们能够提供.NET标准或.NET核心代码中的功能,但允许.NET Framework仍然使用自己的实现。

1 个答案:

答案 0 :(得分:1)

兼容包引用了一些被带回来的程序集,以增加.NET Core与.NET Framework的兼容性。

包的工作方式是有一个元包(你引用的那个),它引用了实际包含实现的各个包。根据目标框架,这些单独的包具有不同的资产。

System.IO.Ports为例。该软件包包含以下资产(以及一些与此无直接关系的内容):

  • net461
  • netstandard2.0

netstandard2.0资产包含实现System.IO.Ports功能的代码。如果要构建.NET Core应用程序,则将使用此方法。

net461资产类型 - 将System.IO.Ports命名空间公开的类型转发到您将在.NET Framework安装中找到的程序集。如果要构建.NET Framework应用程序(如网站的控制台应用程序),则将使用这些。

这意味着当您在.NET Core上使用库时,您正在使用已移植并可在.NET Core上运行的实现。

在.NET Framework上使用库时,您将使用.NET Framework中的实现。