mscorlib.dll和System.dll

为什么MS最初决定维护这两个独立的核心库? 也许他们有一些可扩展性的问题,但现在我从来没有看到任何types的应用程序,不需要这两个。 有没有人有这方面的内幕消息? 这并不重要,但多年来我一直在想。

PS。 我知道在两个库中有什么,我知道不同之处 – 我是Reflector的粉丝:)只是想知道两者的分离有什么实际用途。

Mscorlib包含本机代码和托pipe代码。

其中包含System.Object实现,它必须始终存在才能使所有内容都能正常工作。

它具有CLR需要在每个受pipe进程中加载​​的唯一程序集的区别。

最初,很多“可选”的东西(技术上不需要运行应用程序的东西)被放到了mscorlib中,因为它们是很可能被大家使用的东西。 这包括诸如HashTable和List之类的东西。

这给了一个全面的提升。 如果每个人都想要使用某个东西,那么把它放入每个人都必须加载的程序集中是有意义的。 那么你不必浪费时间去约束一大堆不同的程序集。

system.dll中的东西基本上都是不值得被包含在mscorlib中的东西。

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

我认为他们可能会为V4(以及更高版本)做更多的这类东西,但我不确定细节。

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

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

另一方面,System.dll没有与CLR紧密绑定(它不需要任何调用进入运行时)。 我们认为System.dll比mscorlib.dll更高层。 将这些程序集分成两个独立的层允许更多的灵活性,从而更容易将System.dll与CLR / mscorlib.dll版本分开(如果我们想这样做)。 理论上,我们可以在不改变CLR / mscorlib版本的情况下对System.dll进行更改和添加function。 分离还可以更轻松地pipe理这些不同层中组件之间的依赖关系规则。

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

长期来说,我们希望尽可能减lessmscorlib中的“可选”内容。 通过从mscorlib推出东西或创build一个新的,更核心的程序集,只包含最低限度的必要types(例如System.Object,System.Int32等)以使托pipe代码正常工作。 这将使我们能够灵活地将新的创新添加到“可选”内容中,并且可以更容易地创build不同的.NET Framework SKU(例如,.NET客户端configuration文件,Silverlight等),而无需重新编译运行时。

我希望这有帮助!

谢谢,贾斯汀

扩展斯科特的答案。

任何给定版本的CLR都与特定版本的mscorlib.dll高度绑定。 这是一个特殊的 DLL在很多方面。 CLR运行时需要某些types/方法可用,并实现了许多在实际代码库中定义的方法。 通过在CLR版本和mscorlib版本之间build立牢不可破的链接,减less了pipe理这种关系的复杂性。

仔细看看任何项目的参考节点。 你永远不会find那里列出mscorlib.dll。 这是很特别的,任何编译器都需要它,因为它包含了使语言语法工作所需的types。 System.Array,System.Int32,System.String,System.Exception等

你可以写一个没有依赖于System.dll的程序(尽pipe这很难),但是你不能写一个不依赖mscorlib.dll的程序

提到的本地/托pipe的东西听起来似乎合理,但我仍然不完全相信。 在任何情况下,MS似乎将mscorlib.dll视为系统所需的核心库,而System.dll包含程序员的核心function – 这听起来也不错。

我刚刚向BCL团队发了同样的问题。 如果有人可以回答…当(如果?)我收到回答,我会在这里发布。 感谢迄今为止的答案!

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