【问题标题】:Large number of assemblies in net461 output folder when building .NET Framework/.NET Standard multitargeting project构建 .NET Framework/.NET Standard 多目标项目时 net461 输出文件夹中的大量程序集
【发布时间】:2017-11-08 16:00:02
【问题描述】:

我有一个针对多个框架的新 SDK 样式 csproj:

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

VS 中的依赖项节点按预期列出了“.NETFramework 4.6.1”和“.NETStandard 2.0” - NETStandard 文件夹将“NETStandardLibrary”作为 SDK 依赖项。

我对多个 TFM 的理解是交叉编译类库以用作完整框架 dll 或 netstandard dll。但是,在 net461 输出文件夹中,我看到 100+ System.xxx.dll,包括 netstandard.dll。

为什么所有这些程序集都在输出中?还是我误解了多目标框架的概念?

【问题讨论】:

  • 这是因为有一些System.XXX.dll是在4.6.1中找到的,而在2.0中没有,所以自然要一起复制,否则会丢失这些文件。我能想到的一个例子是 System.IO.Compression 命名空间 2.0 msdn.microsoft.com/en-us/library/… 4.6.1 msdn.microsoft.com/en-us/library/… 请注意,4.6.1 比 2.0 有更多的东西,如果您要在 2.0 中使用 4.6.1 项项目,它不会工作,唯一的方法是让 2.0 引用 4.6.1 dll
  • 我说的是与这种情况相反的情况 - System.*.dll 正在与 net461 构建一起输出......即使所有(大多数?)这些 API 都内置在框架中。 Jacek 下面关于垫片的回答解释了这一点。

标签: c# packages .net-standard .net-standard-2.0 .net-4.6.1


【解决方案1】:

DotNet Standard repo 的几个问题中详细描述了该问题。简短的解释是:

原因是 net471 是第一个实际包含 netstandard20 API 的 .NET Framework - 其他人使用 shims

这意味着每次引用 .NETStandard nuget 包时,如果 .NET Framework 的版本低于 v4.7.1,它将拉取整个 .NETStandard 程序集。

【讨论】:

  • 实际上,如果依赖闭包中的任何 dll 引用了 .net 标准程序集,则会添加库。因此,如果您创建一个 netstandard 2.0 程序集并将其添加为对经典项目的引用,它将添加垫片。这是通过 VS 2017 中提供的构建逻辑和 CLI 完成的,CLI 也可作为 VS 2015 的扩展使用
  • 来自 Jacek 的链接正是它 - 不知道我在事先搜索时怎么没有遇到它。
  • 我仍然想弄清楚这里到底发生了什么……我(显然天真!)认为它正在针对 net461 进行完整的独立构建
  • @noelep 我也有同样的问题,也想知道。你最终解决了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多