2008-12-31 66 views
54

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

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

回答

39

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

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

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

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

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

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

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

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

0

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

6

仔细看看任何项目的参考节点。你永远不会在那里找到mscorlib.dll。它是特殊的,任何编译器都需要它,因为它包含了使语言语法工作所需的类型。 System.Array,System.Int32,System.String,System.Exception等

您可以编写一个程序,该程序对System.dll没有依赖性(虽然它很难),但是不能写一个不依赖于mscorlib.dll的文件。

+4

是的,你可以 - 只要使用`csc`用'包括/ nostdlib [+ | - ]`转 – 2008-12-31 10:51:58

+1

我的理解是,包括/ nostdlib仅影响符号编译器进口。 我相信你的过程在运行时会加载mscorlib,无论你做什么。 – 2008-12-31 12:04:43

+0

那么,假设你将它加载到MS的.NET的障碍...加载到单声道,它可能不会。 – 2008-12-31 15:35:56

1

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

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

16

扩大Scott的答案。

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

67

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

Jared的堆栈溢出的答案是 正确的。由于他提到的原因,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进行更改并添加功能 。分隔 还可以更轻松地管理这些不同层中的组件之间的依赖关系规则。

正如斯科特所说,它看起来好像 有很多“可选”的东西在 mscorlib。这主要是因为 的历史原因,因为有些 的东西只是其他 东西所需要的。例如,有没有 技术原因 System.IO.IsolatedStorage需要在mscorlib程序 ,但是这只是它 发生在1.0以复加,之前我们 是否想过这样 版本/分层的关注。此外, 列表位于mscorlib中,因为mscorlib中的其他 代码需要 基本列表集合。

长期来说,我们希望尽可能地减少mscorlib 中的“可选”东西的数量 。无论是 推动东西出来的mscorlib或 创建一个新的,更核心,组装 只包含最低限度 必要的类型(例如System.Object的, System.Int32等),使管理 代码工作。这将使我们的 灵活性,以新的创新添加到 的“可选”的东西,并使其 更容易地创建不同的.NET框架 的SKU(如.NET客户端 档案,Silverlight的,等等),而不 有改变运行时间。

我希望这有助于!

感谢, 贾斯汀

相关问题