55

为什么 MS 最初决定维护这两个独立的核心库?也许他们考虑到了一些可伸缩性问题,但现在我从未见过任何类型的应用程序不需要两者。有人有这方面的内幕消息吗?这并不重要,但多年来一直在我脑海中。

PS。我知道这两个库中有什么,我知道区别 - 我是Reflector的忠实粉丝:) 只是想知道两者的分离有什么实际用途。

4

6 回答 6

71

我在 CLR/BCL 团队工作,刚刚回复了您的电子邮件。这里粘贴在下面:

Jared 对 Stack Overflow 的回答是正确的。由于他提到的原因,mscorlib.dll 与 CLR 紧密绑定。请注意,mscorlib.dll 本身不包含任何本机代码(正如 Scott 建议的那样),但有很多地方需要直接调用 CLR。因此,CLR 和 mscorlib 必须一起进行版本控制。

另一方面,System.dll 没有与 CLR 紧密绑定(它不需要对运行时进行任何调用)。我们认为 System.dll 位于比 mscorlib.dll 更高的层。将这些程序集放在两个单独的层中可以提供更大的灵活性,从而更容易将 System.dll 与 CLR/mscorlib.dll 版本分开(如果我们想这样做的话)。理论上,我们可以在不更新 CLR/mscorlib 版本的情况下对 System.dll 进行更改和添加功能。这种分离还使得管理这些不同层中组件之间的依赖关系规则变得更加容易。

正如 Scott 提到的,mscorlib 中似乎有很多“可选”的东西。这主要是出于历史原因,因为有些东西是其他东西需要的。例如,System.IO.IsolatedStorage 需要在 mscorlib 中没有技术原因,但在我们真正考虑此类版本控制/分层问题之前,它恰好是在 1.0 中添加的。此外,列表位于 mscorlib 中,因为 mscorlib 中的其他代码需要基本列表集合。

从长远来看,我们希望尽可能减少 mscorlib 中“可选”内容的数量。要么从 mscorlib 中推出东西,要么创建一个新的、更核心的程序集,该程序集只包含使托管代码工作所需的最少必要类型(例如 System.Object、System.Int32 等)。这将使我们能够灵活地将新的创新添加到“可选”内容中,并使创建不同的 .NET Framework SKU(例如 .NET Client Profile、Silverlight 等)变得更加容易,而无需修改运行时。

我希望这有帮助!

谢谢,贾斯汀

于 2009-01-01T00:03:42.333 回答
40

Mscorlib 确实包含本机代码和托管代码。

除其他外,它还包含 System.Object 实现,它必须始终存在才能使一切正常工作。

它的区别是 CLR 需要在每个托管进程中加载​​的唯一程序集。

最初,很多“可选”的东西(技术上不需要运行应用程序的东西)被放入 mscorlib,因为它们很可能被每个人使用。这包括像 HashTable 和 List 这样的东西。

这提高了性能。如果每个人都想使用某些东西,那么将它放在每个人都必须加载的程序集中是有意义的。这样您就不必浪费时间去绑定一大堆不同的程序集了。

system.dll 中的内容基本上是所有不“值得”包含在 mscorlib 中的东西。

然而,这种趋势正在开始逆转。CLR 正在努力减小 mscorlib 的大小。例如,为 Silverlight 删除了很多东西(以减少下载大小)。

我认为他们可能会为 V4(及更高版本)做更多此类事情,但我不确定细节。

于 2008-12-31T10:36:01.513 回答
16

扩展斯科特的答案。

任何给定版本的 CLR 都与特定版本的 mscorlib.dll 高度相关。它在很多方面都是一个特殊的 DLL。CLR 运行时要求某些类型/方法可用,并实现实际代码库中定义的许多方法。通过在 CLR 版本和 mscorlib 版本之间建立牢不可破的链接,可以降低管理这种关系的复杂性。

于 2008-12-31T14:45:48.997 回答
6

仔细查看任何项目的 References 节点。您永远不会找到那里列出的 mscorlib.dll。它很特别,任何编译器都需要它,因为它包含使语言语法工作所需的类型。System.Array、System.Int32、System.String、System.Exception 等。

您可以编写一个不依赖于 System.dll 的程序(尽管这会很困难),但您不能编写一个不依赖于 mscorlib.dll 的程序

于 2008-12-31T10:29:32.070 回答
1

提到的本机/托管的东西听起来很合理,但我仍然不完全相信。无论如何,MS 似乎将 mscorlib.dll 视为系统所需的核心库,而 System.dll 包含程序员的核心功能——这听起来也不错。

我刚刚将同样的问题通过电子邮件发送给 BCL 团队。如果有人可以回答...当(如果?)我收到答案时,我会在此处发布。感谢您到目前为止的答案!

于 2008-12-31T14:27:09.313 回答
0

这只是一个猜测,但 mscorlib.dll 可能还有一些对 CLR 运行时很重要的 C 代码以及 .NET 程序集或一些混合模式代码。System.dll 可能都是托管的。

于 2008-12-31T10:18:18.007 回答