mscorlib.dll& System.dll中

时间:2008-12-31 09:03:22

标签: .net assemblies

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

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

6 个答案:

答案 0 :(得分:68)

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

  

Jared对Stack Overflow的回答是   就在。 mscorlib.dll很紧   因为他的原因而绑定到CLR   提及。请注意mscorlib.dll   本身不包含任何本机代码   (正如斯科特建议的那样),但有   很多需要打电话的地方   直接进入CLR。就这样,   必须对CLR和mscorlib进行版本控制   在一起。

     另一方面,

System.dll不是   紧紧地绑定到CLR(它没有   需要对运行时的任何调用)。   我们认为System.dll位于   比mscorlib.dll更高的层。   将这些组件分成两部分   单独的图层允许更多   灵活性,使其更容易   版本System.dll与。分开   CLR / mscorlib.dll版本(如果我们想要的话)   这样做)。从理论上讲,我们可以做到   更改并添加功能   System.dll没有加速   CLR / mscorlib版本。分离   也使管理更容易   组件之间的依赖规则   这些不同的层次。

     

正如斯科特提到的那样,看起来确实如此   中有很多“可选”的东西   mscorlib程序。这主要是为了   历史原因和一些原因   其他东西只需要东西   的东西。例如,没有   技术原因   System.IO.IsolatedStorage需要   在mscorlib,但这就是它的位置   碰巧在我们之前加入了1.0   真的想过这样的   版本控制/分层问题。也,   列表在mscorlib中,因为其他   mscorlib中的代码需要a   基本清单集。

     

长期来看,我们希望减少   mscorlib中“可选”内容的数量   越多越好。或者通过   推出mscorlib或   创建一个新的,更核心的程序集   只包含最低限度   必要的类型(例如System.Object,   System.Int32等)进行托管   代码工作。这会给我们带来的   灵活地添加新的创新   “可选”的东西,并制作它   更容易创建不同的.NET   框架SKU(例如.NET客户端   配置文件,Silverlight等),没有   必须改变运行时间。

我希望这有帮助!

谢谢, 贾斯汀

答案 1 :(得分:40)

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

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

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

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

这给了一个性能提升。如果每个人都想要使用某些东西,那么将它放入每个人都必须加载的程序集中是有意义的。然后你不必浪费时间去绑定一大堆不同的组件。

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

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

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

答案 2 :(得分:16)

扩大斯科特的答案。

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

答案 3 :(得分:6)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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