【发布时间】:2017-12-16 04:28:52
【问题描述】:
在 SO 和 MS 的文档中有很多关于什么是 .net-Standard 概念上的问题、哪些版本在哪些框架中实现、如何定位和引用不同的 .net-Stantard、.net-Core 或 .net - 框架版本和兼容性问题是什么...
但是,我找不到任何关于完整事物如何“工作”的好资源。我已经从github repo下载了源码,貌似都是这样实现的:
- 所有类、结构和接口都被声明为部分。
- 所有类型的所有公共成员(ctor、方法和道具)都实现为
throw null;。 - 所有枚举和常量都使用预期值实现。
所有这些都很有意义,因为 .net-Standard 没有实现任何东西(除了明显的常量和枚举,它们预计在所有框架中都具有相同的值)。但您也可以通过仅针对库中的 .net-Standard 适当版本来使用所有这些类型和成员。
但是,部分类必须将所有部分包含在同一个程序集中,并且所有部分都必须声明为部分,并且不能多次实现相同的成员(也有意义)。这让我觉得这不是这里发生的常规编译器工作。
假设您有一个 .net-Core 控制台应用程序,它引用了一个 .net-Standard 库程序集,其中某些类型引用了未实现的 .net-Standard DateTime 结构。显然,预期的行为应该是运行时使用的类型应该是来自 .net-Core 的 DateTime 实现,但是使用 .net-Standard 编译的程序集不使用它。
这是如何工作的?我可以推断出两种可能的情况,但都不是理想的:
- 编译器重新编译 .net-Standard 程序集,将所有引用替换为正确的 .net-Core 实现,并实际使用这个新程序集。这意味着您不能仅将 .net-Standard 程序集“放置”到您的 .net-Core 应用程序程序集之外并使其工作。
- 发生了某种运行时魔法,它用propper 实现动态替换了类型。我怀疑这会不会有好的表现。
那么,我在这里缺少什么,这实际上是如何工作的?任何人都可以提供任何解释这一点的文档吗? (我确定它存在,只是找不到)。
【问题讨论】:
-
感谢指出类型转发,我不知道它在这里肯定起作用。
标签: .net-standard