净标准包

时间:2017-06-16 09:26:06

标签: c# .net cross-platform .net-standard

我一整天都在研究.NET Standard及其与多个框架的集成;我想我已经完成了所有这一切,但只有一个问题在我的脑海里徘徊,而且与包内容相关。

例如,我的目标是净标准1.6 ,当我查看visual studio 2017中的程序集列表时,我可以看到:&#34; System.Reflection(4.3.0 )&#34; 即可。这意味着我支持该版本的程序集,但是标准版本的API规范表明它不支持例如&#34; System.Reflection.Emit.ILGeneration&#34; < / strong>即可。

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

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

根据装配清单我有,所以我的问题是:

  • 在API规范中没有实现ILGeneration的原因导致Xamarin.iOS没有DLR支持(AOT编译器)?
  • 添加软件包是否可能会破坏另一个使用net standard 1.6的库或框架? (忽略Xamarin.iOS)
  • 如果我使用的是Xamarin.iOS或与其他实现存在任何潜在冲突,那么仅仅使用条件编译会阻止我删除ILGeneration包吗? (假设最后一个问题是真的)。​​

提前致谢。

1 个答案:

答案 0 :(得分:1)

这里最大的区别是,有一些API .NET Standard中的以及构建在之上的一些软件包。

在.NET标准中&lt; 2.0,&#34;标准&#34;由NETStandard.Library包引入的包的闭包来定义。System.Reflection.Emit.ILGeneration被认为是在标准之外但是应该适用于支持.NET标准的大多数平台,因为它建立在它 - 特别是对于ILGeneration,这可能不完全正确,因为它与底层运行时紧密相关。但关键是构建在标准之上的软件包可以提供api,但是当特定平台不支持某个功能时,可以选择抛出异常。

而不是引用NETStandard.Library,从CoreFX构建的包引用单个包以避免一些鸡和蛋的问题(NETStandard.LibraryMicrosoft.NETCore.App大多只是集合他们的包裹)。其他一些第三方库也会这样做,但是对于新项目不建议使用此设置,因为通过NETStandard.Library的更新进行了一些修复。

Microsoft.NETCore.App由软件包组成的奇怪副作用是,为.NET Standard 1.6构建的一些软件包正在引入实现,而不仅仅是定义&#34;合同&#34;。 / p>

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

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

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

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

  3. 仅限您的功能:)默认情况下,.NET SDK不支持Xamarin目标框架,但使用MSBuild.Sdk.Extras NuGet包,您可以创建一个多目标.NET Standard和Xamarin iOS。