Como dice @amdluigi, "Normalmente, el nombre del ensamblado es el mismo que el de un espacio de nombres que contiene, pero no siempre".
Hay una captura de pantalla arriba de System.Data.dll en el Explorador de objetos en Studio. Es un excelente ejemplo para explorar los problemas aquí. Tenga en cuenta que la mayoría de los espacios de nombres contenidos en el ensamblado son System.Data o un sub-espacio de nombres de System.Data.
En general, es una buena práctica que los nombres de ensamblados estén relacionados con los espacios de nombres dentro de ellos. Observe que cuando Studio crea por primera vez un proyecto para construir un ensamblado, una de las propiedades del proyecto es un espacio de nombres predeterminado. Al principio, Studio le da al espacio de nombres predeterminado el mismo nombre que el proyecto en sí. Si alguna vez elige cambiar el nombre de un proyecto, considere cambiar también su espacio de nombres predeterminado.
Hay dos espacios de nombres adicionales: Microsoft.SqlServer es comprensible. Algunos tipos de SQL Server que no querían empaquetar en un ensamblado separado.
Pero, ¿qué pasa con System.Xml ???? Hay un ensamblado System.Xml.dll. ¿Por qué este espacio de nombres también aparece en System.Data.dll?
Observe que un ensamblado puede reabrir un espacio de nombres y agregarle más; eso es exactamente lo que hace System.Data.dll con el espacio de nombres System.Xml.
La razón es que los espacios de nombres no tienen implicaciones de rendimiento, pero los ensamblados sí. Si tiene 1000 clases con cantidades sustanciales de código, no desea un ensamblado con una huella de memoria muy grande. Tampoco quieres 1000 ensamblajes cada uno con una clase. Cualquier ensamblado debe cargarse en la memoria antes de que se pueda ejecutar su contenido. Desea que un ensamblado contenga una cantidad razonable de clases interrelacionadas, por lo que una vez que su aplicación ha cargado un ensamblado para obtener una de sus clases, obtiene otras clases que es probable que la aplicación necesite de forma gratuita. La granularidad es importante: ni demasiado grande, ni demasiado pequeña, simplemente correcta.
Observe que System.Data.dll vuelve a abrir System.Xml y agrega exactamente una clase: XmlDataDocument. Sucede que esta clase se usa para interpretar datos relacionales como un documento XML. Si su aplicación solo usa XML, no necesitará esta clase. Si su aplicación trata con datos relacionales, podría hacerlo. Entonces, mientras XmlDataDocument hereda de XmlDocument y está en el espacio de nombres System.Xml, está empaquetado en el ensamblado System.Data.dll.
Todo esto es particularmente importante si tiene experiencia con Java, donde solo hay un concepto, el paquete. En .NET hay dos, el ensamblado y el espacio de nombres. Los dos son ortogonales. Obviamente, un ensamblado puede contener más de un espacio de nombres. Un ensamblado puede volver a abrir un espacio de nombres y agregarle más; en otras palabras, los tipos en un espacio de nombres pueden abarcar más de un ensamblado.