.Net标准实施解决方案

时间:2017-12-14 17:50:34

标签: .net-standard

MS的SO和文档中有很多问题,关于什么是.net-Standard概念,什么版本在什么框架中实现,如何定位和引用不同的.net-Stantard,.net-Core或.net - 框架版本以及兼容性问题是什么......

然而,我找不到任何有关如何完整“有效”的好资源。我已经从github repo下载了源代码,似乎所有内容都实现如下:

  • 所有类,结构和接口都声明为partial。
  • 所有类型都将所有公共成员(ctors,方法和道具)实现为throw null;
  • 所有枚举和常量都使用预期值实现。

所有这一切都很有意义,因为.net-Standard没有实现任何东西(除了明显的常量和枚举,预计在所有框架中都有相同的值)。但是,您也可以通过仅定位库中的.net-Standard适当版本来使用所有这些类型和成员。

但是,部分类必须包含在同一个程序集中的所有部分,并且所有部分必须声明为部分,并且不能多次实现相同的成员(也是有意义的)。这让我觉得这不是常规的编译器工作。

假设您有一个.net-Core控制台应用程序,该应用程序引用.net-Standard库程序集,其某些类型引用了未实现的.net-Standard DateTime结构。显然,预期的行为应该是运行时使用的类型应该是.net-Core的DateTime实现,但是使用.net-Standard编译的程序集不会使用它。

这是如何运作的?我可以推断两种可能的情况,其中没有一种是理想的:

  • 编译器重新编译.net-Standard程序集,用propper .net-Core实现替换所有引用,并实际使用这个新程序集。这意味着你不能只是把.net-Standard与你的.net-Core应用程序组件一起“放置”并使它工作。
  • 有一些运行时魔术的发生,它可以动态地替换类型和propper实现。我怀疑这会有很好的表现。

那么,我在这里错过了什么,这实际上是如何运作的?任何人都可以提供任何解释说明的文件吗? (我确信它存在,我找不到它。)

1 个答案:

答案 0 :(得分:1)

视频.NET Standard - Under the Hood中提供了解释,该视频在.NET Standard FAQ的末尾引用。更多信息在.NET Standard 2.0 README

中提供

答案实际上是您想象的两种方案的组合 - 在编译时重定向到引用程序集,并且在运行时发生类型转发到实现程序集。

另请参阅:The how-dare-you-call-me-an-idiot’s guide to the .NET Standard