网标包
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)
根据集会列表我有,所以我的问题是:
- ILGeneration 未在 API 规范中实现的原因是 Xamarin.iOS 没有 DLR 支持(AOT 编译器)?
- 在引用的情况下,添加包是否会与使用 net standard 1.6 的另一个库或框架混淆? (忽略Xamarin.iOS)
- 如果我正在使用 Xamarin.iOS 或任何与其他实现的潜在冲突,是什么阻止我仅使用条件编译并删除 ILGeneration 包? (假设最后一个问题是正确的)。
提前致谢。
这里最大的不同是 .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.Library
和 Microsoft.NETCore.App
大多只是收集他们的包裹)。其他一些第 3 方库也这样做,但不鼓励对新项目进行此设置,因为一些修复是通过更新 NETStandard.Library
.
进行的
Microsoft.NETCore.App
由包组成的一个奇怪的副作用是,有一些为 .NET Standard 1.6 构建的包正在引入实现,而不仅仅是定义 "a contract".
对于 .NET Core 2.0 和 .NET Standard 2.0,此设置略有变化,因为两个包 NETStandard.Library
和 Microsoft.NETCore.App
不再是 "meta-packages",而是包含一个平面包一堆 dll(甚至是独立应用程序的本机资产)。此外,为 netstandard2.0
构建的库在发布时默认不包含包引用 - .NET Standard 的 API 被认为是由平台引入的。
考虑到这一点,让我们看看您的问题:
IL 生成不属于标准的原因很可能是 AOT 编译限制。这包括 Xamarin iOS,但也可能适用于 .NET Native 和 CoreRT。由于并非所有平台都需要实施 API,这被视为 "extension to the standard",因此它可能无法在所有平台上运行,即使它们支持 .NET Standard 1.6
仅当此其他项目需要在不支持相关 API 的平台上 运行 时。使用此包引入的限制可传递地适用于引用它的所有项目。
只有你的功能:) 默认情况下,.NET SDK 不支持 Xamarin 目标框架,但通过使用 MSBuild.Sdk.Extras
NuGet 包,你可以创建一个多目标 .NET 的库标准和 Xamarin iOS.
我一整天都在研究 .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)
根据集会列表我有,所以我的问题是:
- ILGeneration 未在 API 规范中实现的原因是 Xamarin.iOS 没有 DLR 支持(AOT 编译器)?
- 在引用的情况下,添加包是否会与使用 net standard 1.6 的另一个库或框架混淆? (忽略Xamarin.iOS)
- 如果我正在使用 Xamarin.iOS 或任何与其他实现的潜在冲突,是什么阻止我仅使用条件编译并删除 ILGeneration 包? (假设最后一个问题是正确的)。
提前致谢。
这里最大的不同是 .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.Library
和 Microsoft.NETCore.App
大多只是收集他们的包裹)。其他一些第 3 方库也这样做,但不鼓励对新项目进行此设置,因为一些修复是通过更新 NETStandard.Library
.
Microsoft.NETCore.App
由包组成的一个奇怪的副作用是,有一些为 .NET Standard 1.6 构建的包正在引入实现,而不仅仅是定义 "a contract".
对于 .NET Core 2.0 和 .NET Standard 2.0,此设置略有变化,因为两个包 NETStandard.Library
和 Microsoft.NETCore.App
不再是 "meta-packages",而是包含一个平面包一堆 dll(甚至是独立应用程序的本机资产)。此外,为 netstandard2.0
构建的库在发布时默认不包含包引用 - .NET Standard 的 API 被认为是由平台引入的。
考虑到这一点,让我们看看您的问题:
IL 生成不属于标准的原因很可能是 AOT 编译限制。这包括 Xamarin iOS,但也可能适用于 .NET Native 和 CoreRT。由于并非所有平台都需要实施 API,这被视为 "extension to the standard",因此它可能无法在所有平台上运行,即使它们支持 .NET Standard 1.6
仅当此其他项目需要在不支持相关 API 的平台上 运行 时。使用此包引入的限制可传递地适用于引用它的所有项目。
只有你的功能:) 默认情况下,.NET SDK 不支持 Xamarin 目标框架,但通过使用
MSBuild.Sdk.Extras
NuGet 包,你可以创建一个多目标 .NET 的库标准和 Xamarin iOS.