我一整天都在研究.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)
根据装配清单我有,所以我的问题是:
提前致谢。
答案 0 :(得分:1)
这里最大的区别是,有一些API .NET Standard中的以及构建在之上的一些软件包。
在.NET标准中&lt; 2.0,&#34;标准&#34;由NETStandard.Library
包引入的包的闭包来定义。System.Reflection.Emit.ILGeneration
被认为是在标准之外但是应该适用于支持.NET标准的大多数平台,因为它建立在它 - 特别是对于ILGeneration,这可能不完全正确,因为它与底层运行时紧密相关。但关键是构建在标准之上的软件包可以提供api,但是当特定平台不支持某个功能时,可以选择抛出异常。
而不是引用NETStandard.Library
,从CoreFX构建的包引用单个包以避免一些鸡和蛋的问题(NETStandard.Library
和Microsoft.NETCore.App
大多只是集合他们的包裹)。其他一些第三方库也会这样做,但是对于新项目不建议使用此设置,因为通过NETStandard.Library
的更新进行了一些修复。
Microsoft.NETCore.App
由软件包组成的奇怪副作用是,为.NET Standard 1.6构建的一些软件包正在引入实现,而不仅仅是定义&#34;合同&#34;。 / p>
对于.NET Core 2.0和.NET Standard 2.0,此设置稍有变化,因为两个包NETStandard.Library
和Microsoft.NETCore.App
不再是&#34; meta-packages&#34;,而是扁平化包含一堆dll的包(甚至是自包含应用程序的本机资产)。此外,为netstandard2.0
构建的库在发布时默认不包含任何包引用 - .NET Standard的API被认为是由平台引入的。
考虑到这一点,让我们看一下你的问题:
IL生成不属于标准的原因很可能是AOT编译限制。这包括Xamarin iOS,但也可能适用于.NET Native和CoreRT。由于并非所有平台都需要实施API,因此这被视为标准的扩展&#34;因此它可能无法在所有平台上运行,即使它们支持.NET Standard 1.6
仅当此其他项目需要在不支持相关API的平台上运行时。通过使用此程序包引入的限制适用于所有引用它的项目。
仅限您的功能:)默认情况下,.NET SDK不支持Xamarin目标框架,但使用MSBuild.Sdk.Extras
NuGet包,您可以创建一个多目标.NET Standard和Xamarin iOS。