Pergunta

Por que MS originalmente tomar a decisão de manter estes dois libs núcleo separado? Talvez eles tiveram algum problema de escalabilidade em mente, mas hoje em dia eu nunca vi uma aplicação, de qualquer tipo, que não precisa de ambos. Alguém tem alguma informação privilegiada sobre este assunto? Não é realmente importante, mas esteve em minha mente por anos.

PS. Eu sei o que está nos dois libs, eu sei a diferença - eu sou um grande fã de Refletor :) Basta saber qual a utilidade prática a separação dos dois tem.

Foi útil?

Solução

mscorlib não contém código nativo e gerenciado.

Entre outras coisas, contém a implementação System.Object, que deve estar sempre presente para que tudo funcione.

Ele tem a distinção de ser o único conjunto que o CLR requer a ser carregado dentro de cada processo gerenciado.

Originalmente, um monte de "opcional" coisas (coisas que, tecnicamente, não são necessários para executar um aplicativo) foi colocado em mscorlib porque eram coisas que eram altamente provável para ser usado por todos. Isso inclui coisas como HashTable e List.

Isso deu um impulso perf. Se todo mundo vai querer usar algo, então faz sentido para colocá-lo dentro do conjunto que todo mundo tem a carga. Então você não precisa perder tempo indo e vinculativa um monte de diferentes montagens.

O material em system.dll era basicamente tudo o que não era "digno" de ser incluído no mscorlib.

Esta tendência, no entanto, está começando a ser revertida. O CLR está a fazer esforços para reduzir o tamanho do mscorlib. Um monte de coisas foi removido para o Silverlight, por exemplo (para reduzir o tamanho de download).

Eu acho que eles poderiam estar fazendo mais desse tipo de coisa para V4 (e versões posteriores), mas não tenho certeza sobre os detalhes.

Outras dicas

Eu trabalho na equipe CLR / BCL e apenas respondeu seu e-mail. Aqui ele é colado abaixo:

A resposta de Jared no Stack Overflow é pode apostar. mscorlib.dll é firmemente ligado ao CLR pelas razões que ele menciona. Note-se que mscorlib.dll em si não contém qualquer código nativo (Como Scott sugere), mas existem muitos lugares onde ele precisa para chamar directamente para o CLR. Como tal, o CLR e mscorlib deve ser versionadas juntos.

System.dll por outro lado, não é firmemente ligado ao CLR (isso não acontece necessita de quaisquer chamadas para o tempo de execução). Consideramos System.dll estar em um camada superior do que mscorlib.dll. Tendo estes conjuntos em dois camadas separadas permite mais flexibilidade, tornando mais fácil versão System.dll separadamente do CLR / versão mscorlib.dll (se queríamos a fazê-lo). Poderíamos, em teoria, make alterações e adicionar funcionalidade para System.dll sem acelerando o CLR / versão mscorlib. A separação Também torna mais fácil de gerir dependência governa entre os componentes em essas diferentes camadas.

Como Scott menciona, parece como há um monte de coisas "opcional" em mscorlib. Isto é principalmente para razões históricas e porque alguns as coisas são apenas necessários por outros coisas. Por exemplo, não há é razão técnica pela qual System.IO.IsolatedStorage precisa ser em mscorlib, mas isso é apenas onde ele passou a ser adicionado em 1,0, antes de realmente pensei sobre tais versionamento / camadas preocupações. Além disso, Lista está em mscorlib porque outros código em mscorlib tem uma necessidade de um coleção lista básica.

Longo prazo, gostaríamos de reduzir o quantidade de material "opcional" em mscorlib tanto quanto possível. quer por empurrando o material fora do mscorlib ou a criação de um novo núcleo mais,, montagem que contém apenas o mínimo tipos necessários (por exemplo, System.Object System.Int32, etc.) para fazer conseguiu código de trabalho. Isso nos dará a flexibilidade para adicionar novas inovações para as coisas "opcional", e torná-lo mais fácil criar .NET diferente Quadro SKUs (por exemplo, o cliente .NET Perfil, Silverlight, etc.), sem ter que acelerar o tempo de execução.

Espero que isso ajude!

Obrigado, Justin

Expandindo resposta de Scott.

Qualquer versão dada do CLR é altamente amarrado a uma determinada versão de mscorlib.dll. É um especial DLL de muitas maneiras. O tempo de execução CLR requer certos tipos / métodos de estar disponível e implementa muitos métodos definidos na base de código real. A complexidade de administrar esta relação é reduzida por ter uma ligação inseparável entre uma versão CLR, e versão de mscorlib.

Dê uma boa olhada nó referências de qualquer projeto. Você nunca vai encontrar mscorlib.dll listado lá. É especial, qualquer compilador precisa dele porque contém tipos que são necessários para fazer o trabalho de sintaxe da linguagem. System.Array, System.Int32, System.String, System.Exception, etc.

Você pode escrever um programa que não tem uma dependência em System.dll (embora que seria difícil), mas você não pode escrever um que não depende de mscorlib.dll

Os / sons coisa gerenciados nativos mencionados plausível, mas eu ainda não estou totalmente convencido. Em qualquer caso, MS parece ver mscorlib.dll como o lib núcleo necessário para o sistema , enquanto System.dll contém a funcionalidade principal para programadores - o que também parece bom.

Eu apenas enviada esta mesma pergunta à equipe de BCL. Se qualquer pode responder ... Quando (se?) Eu recebo uma resposta, eu vou postá-lo aqui. Agradecimentos para as respostas até agora!

Este é apenas um palpite, mas mscorlib.dll provavelmente também tem algum código C que é importante para o tempo de execução CLR, bem como sendo um .NET assembly, ou algum código de modo misto. System.dll é provavelmente tudo gerenciado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top