Вопрос

Почему MS изначально приняла решение поддерживать эти две отдельные основные библиотеки?Возможно, они имели в виду какую-то проблему масштабируемости, но в настоящее время я никогда не вижу приложения любого типа, которому не требовалось бы и то, и другое.Есть ли у кого-нибудь инсайдерская информация по этому поводу?Это не так уж и важно, но я думал об этом уже много лет.

ПС.Я знаю, что есть в двух библиотеках, я знаю разницу — я большой поклонник Отражатель :) Просто интересно, какую практическую пользу имеет разделение этих двух.

Это было полезно?

Решение

Mscorlib содержит как собственный, так и управляемый код.

Помимо прочего, он содержит реализацию System.Object, которая всегда должна присутствовать, чтобы все работало.

Она отличается тем, что является единственной сборкой, которую CLR требует загрузки внутри каждого управляемого процесса.

Первоначально в mscorlib было добавлено множество «необязательных» вещей (вещей, которые технически не требуются для запуска приложения), потому что они с высокой вероятностью будут использоваться всеми.Сюда входят такие вещи, как HashTable и List.

Это дало прирост производительности.Если каждый захочет что-то использовать, то имеет смысл поместить это в сборку, которую каждый должен загрузить.Тогда вам не придется тратить время на сборку и связывание целой кучи разных сборок.

В system.dll, по сути, было все, что не «достойно» быть включенным в mscorlib.

Однако эта тенденция начинает меняться.CLR прилагает усилия по уменьшению размера mscorlib.Например, для Silverlight было удалено много вещей (чтобы уменьшить размер загрузки).

Я думаю, что они могут делать больше подобных вещей для V4 (и более поздних версий), но я не уверен в деталях.

Другие советы

Я работаю в команде CLR/BCL и только что ответил на ваше письмо.Вот это вставлено ниже:

Ответ Джареда на переполнение стека в порядке.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 имеет необходимость в базовой сборе списков.

В долгосрочной перспективе мы хотели бы как можно больше сократить количество «дополнительных» вещей в маскарлибе.Либо, выталкивая вещи из MSCORLIB, либо создавая новую, более ядро, сборку, которая просто содержит минимальные необходимые типы (например,System.object, System.int32 и т. Д.) Для выполнения управляемого кода работа.Это даст нам гибкость, чтобы добавить новые инновации в «необязательные» вещи и облегчит создание различных фреймворков .NET SKU (например,Профиль клиента .NET, Silverlight и т. Д.), Не имея необходимости преодоления времени выполнения.

Надеюсь, это поможет!

Спасибо, Джастин

Расширение ответа Скотта.

Любая версия CLR тесно связана с конкретной версией mscorlib.dll.Это особенный DLL во многих отношениях.Среда выполнения CLR требует наличия определенных типов/методов и реализует множество методов, определенных в фактической базе кода.Сложность управления этими отношениями снижается за счет наличия неразрывной связи между версией CLR и версией mscorlib.

Внимательно посмотрите на узел «Ссылки» любого проекта.Вы никогда не найдете там mscorlib.dll.Он особенный, он нужен любому компилятору, поскольку содержит типы, необходимые для работы синтаксиса языка.System.Array, System.Int32, System.String, System.Exception и т. д.

Вы можете написать программу, которая не зависит от System.dll (хотя это будет сложно), но вы не можете написать программу, которая не зависит от mscorlib.dll.

Упомянутая нативная/управляемая вещь звучит правдоподобно, но я все еще не совсем убежден.В любом случае, MS, похоже, рассматривает mscorlib.dll как основную библиотеку, необходимую для система, а System.dll содержит основные функции для программисты - что тоже звучит хорошо.

Я только что отправил тот же вопрос по электронной почте команде BCL.Если любой могу ответить...Когда (если?) получу ответ, опубликую его здесь.Спасибо за ответы!

Это всего лишь предположение, но mscorlib.dll, вероятно, также содержит некоторый код C, важный для среды выполнения CLR, а также является сборкой .NET или неким кодом смешанного режима.System.dll, вероятно, все управляемо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top