.Net Framework 和 .Net Core 使用的 .Net Standard 2.0 dll 中的 NuGet 包

Vac*_*ano 5 c# nuget .net-standard .net-standard-2.0

设置

假设我有一个 .Net Standard 2.0 类库项目,我向其中添加了一个与 .Net Standard 2.0 兼容的 Nu NuGet 包。

然后,我从 .Net Framework 控制台项目和 .Net Core 控制台项目引用该类库项目。

用图片重述一下:

通过 DLL 的 NuGet

问题

每个控制台应用程序如何处理为其应用程序类型获取正确的 NuGet 代码?

笔记

注意:我使用 Microsoft.Extensions.DependencyInjection 进行了尝试,它在 .Net Core 3.1 控制台应用程序中工作正常,但在 .Net Framework 4.7.2 控制台应用程序中抛出“文件未找到”异常(寻找依赖注入DLL)。这让我相信 .Net Standard 2.0 NuGets 确实是 .Net Core NuGets...

注意事项:我试图了解这里发生的情况,而不是解决“找不到文件”问题。(通过引用 .Net Framework 4.7.2 控制台应用程序中的 Microsoft.Extensions.DependencyInjection NuGet 可以轻松修复此问题)。

tha*_*guy 6

在您的场景中,使用了两种不同的包解析策略。管理包有旧的方式packages.config和新的方式PackageReferences。还有 .NET Framework 项目的旧项目格式和为 .NET Core 引入的新SDK 样式格式,但也可在 .NET Framework 应用程序中使用。

由于大多数现有 .NET Framework 应用程序仍然使用旧的项目格式(无论 或 )packages.config,. PackageReferenceNET Framework 控制台应用程序只能访问类库,而不能访问其引用的 NuGet 包的程序集,因为它不是一个直接引用但通过您的图书馆,因此是间接的。这也称为传递依赖。

在新的 SDK 风格的项目格式中PackageReference,这是根本不同的。在那里,传递依赖是可能的。这意味着,.NET Framework 控制台应用程序可以通过 NuGet 包访问类库项目及其引用的程序集。

SDK 样式格式PackageReference是 .NET Core 项目的默认格式,因此它们支持开箱即用的传递依赖项。仅使用旧的项目格式,您必须手动添加 NuGet 包,因为它无法通过类库访问传递依赖项。您可以将现有 .NET Framework 项目迁移到新的 SDK 样式格式,以实现与 .NET Core 中相同的行为。