网标包

Net standard package

我一整天都在研究 .NET Standard 及其与多个框架的集成;我想我明白了,但只有一个问题在我脑海中徘徊,它与包裹包含有关。

例如,我的目标是 net 标准 1.6,当我查看 visual studio 2017 中的程序集列表时,我可以看到:"System.Reflection (4.3.0)"。这意味着我支持那个版本的程序集,但是网络标准版本的 API 规范说它不支持 "System.Reflection.Emit.ILGeneration"

那么如果我添加包 ILGeneration 4.3.0 会发生什么?根据包,我需要支持:

System.Reflection (>= 4.3.0)
System.Reflection.Primitives (>= 4.3.0)
System.Runtime (>= 4.3.0)

根据集会列表我有,所以我的问题是:

提前致谢。

这里最大的不同是 .NET Standard 中有一些 APIs .NET Standard 和一些 built 的包在之上。

在 .NET Standard < 2.0 中,"the standard" 是由 NETStandard.Library 包引入的包的闭包定义的。 System.Reflection.Emit.ILGeneration 然后被认为不在标准范围内,但是应该适用于大多数支持 .NET Standard 的平台,因为它是建立在它之上的——特别是对于 ILGeneration,这可能不完全正确,因为它与底层 运行 紧密相关。但要点在于,构建在标准之上的包可以提供 api 但在特定平台不支持某个功能时选择抛出异常。

CoreFX 构建的包不是引用 NETStandard.Library,而是引用各个包以避免一些先有鸡还是先有蛋的问题(NETStandard.LibraryMicrosoft.NETCore.App 大多只是收集他们的包裹)。其他一些第 3 方库也这样做,但不鼓励对新项目进行此设置,因为一些修复是通过更新 NETStandard.Library.

进行的

Microsoft.NETCore.App 由包组成的一个奇怪的副作用是,有一些为 .NET Standard 1.6 构建的包正在引入实现,而不仅仅是定义 "a contract".

对于 .NET Core 2.0 和 .NET Standard 2.0,此设置略有变化,因为两个包 NETStandard.LibraryMicrosoft.NETCore.App 不再是 "meta-packages",而是包含一个平面包一堆 dll(甚至是独立应用程序的本机资产)。此外,为 netstandard2.0 构建的库在发布时默认不包含包引用 - .NET Standard 的 API 被认为是由平台引入的。

考虑到这一点,让我们看看您的问题:

  1. IL 生成不属于标准的原因很可能是 AOT 编译限制。这包括 Xamarin iOS,但也可能适用于 .NET Native 和 CoreRT。由于并非所有平台都需要实施 API,这被视为 "extension to the standard",因此它可能无法在所有平台上运行,即使它们支持 .NET Standard 1.6

  2. 仅当此其他项目需要在不支持相关 API 的平台上 运行 时。使用此包引入的限制可传递地适用于引用它的所有项目。

  3. 只有你的功能:) 默认情况下,.NET SDK 不支持 Xamarin 目标框架,但通过使用 MSBuild.Sdk.Extras NuGet 包,你可以创建一个多目标 .NET 的库标准和 Xamarin iOS.