为什么MS最初决定维护这两个独立的核心库?也许他们考虑到了一些可伸缩性问题,但是现在我从来没有看到任何类型的应用程序都不需要这两者。有没有人有这方面的内幕消息?这不是很重要,但多年来一直在我的脑海里。
PS。我知道两个库中有什么,我知道区别 - 我是Reflector的忠实粉丝:)只是想知道两者分离的实际用途。
答案 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可能都是托管的。