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

3
我正在努力将一个庞大的代码库转向支持.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 Standard或.NET Core代码中提供功能,但仍然允许.NET Framework使用自己的实现。

不知道,但你考虑过使用条件编译吗?https://dev59.com/J1oT5IYBdhLWcg3w6iwA - user1228
1
我已经研究了多目标,但似乎存在一些设置复杂性,以正确分叉依赖项,以允许.NET Framework和.NET Standard目标使用不同的NuGet包和框架库引用。 - StuffOfInterest
你可能已经找到了解决方案,但这里有一些想法。我曾经进行过一个更大的迁移(50个项目,8个服务),其中库被移植到了.NET Standard,一些服务针对.NET Core使用ASP.NET Core,一些针对完整框架,还有一些是“旧”的ASP.NET服务。我通过使用接口和依赖注入来抽象功能并管理间接引用和不必要的耦合问题。 - Iris Classon
另外,我想补充一下,如果你的目标是跨平台,API分析器可能会很有用,可以检测到不支持所有平台的API。今天合并了一个拉取请求,也可以扫描Windows兼容性包引用,拉取存储库并编译分析器,手动添加DLL或留意下一个版本。https://github.com/dotnet/platform-compat 。这里有一个与PM讨论分析器和兼容包的讨论https://twitter.com/IrisClasson/status/978293740736581632 。祝你迁移愉快,我知道我已经愉快了:D - Iris Classon
Windows兼容性包应仅在.NET Core应用程序中使用,而不是.NET标准类库。在我看来,如果你遵循这个规则,那么最初就不会出现这个问题。 - Lex Li
1个回答

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 中的实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接