2010-05-21 33 views
18

A través de los años, mi aplicación ha crecido de 1MB a 25MB y espero que aumente a 40, 50 MB. No uso DLL's, pero pongo todo en este gran ejecutable.¿Un archivo ejecutable grande o muchos DLL pequeños?

Tener una gran ejecutable tiene ciertas ventajas:

  • Instalación de mi aplicación en el cliente está realmente: copiar y ejecutar.
  • Las actualizaciones pueden ser fácilmente comprimido y enviado al cliente
  • No hay riesgo de tener conflicto DLL (donde el cliente tiene la versión X del EXE, pero la versión Y de la DLL)

La gran La desventaja del gran EXE es que los tiempos de enlace parecen crecer exponencialmente.

Problema adicional es que una parte del código (digamos alrededor del 40%) se comparte con otra aplicación. Una vez más, las ventajas son que:

  • no hay riesgo de tener una mezcla de versiones de DLL incorrectos
  • Cada desarrollador puede hacer cambios en el código común que acelera la evolución.

Pero, una vez más, esto tiene un serio impacto en los tiempos de compilación (todos compilan el código común nuevamente en su PC) y en los tiempos de enlace.

La pregunta Grouping DLL's for use in Executable menciona la posibilidad de mezclar DLL en un ejecutable, pero parece que esto todavía requiere que vincules todas las funciones manualmente en tu aplicación (usando LoadLibrary, GetProcAddress, ...).

¿Cuál es su opinión sobre los tamaños de ejecutables, el uso de DLL y el mejor 'equilibrio' entre la implementación fácil y el desarrollo fácil/rápido?

Respuesta

13

Un único ejecutable tiene un gran impacto positivo en el mantenimiento. Es más fácil depurar, implementar (problemas de tamaño a un lado) y diagnosticar en el campo. Como usted señala, evita completamente el infierno de DLL.

La solución más directa para su problema es tener dos modos de compilación, uno que construye un solo exe para la producción y otro que genera muchos DLL pequeños para el desarrollo.

+4

Dado que las desventajas enumeradas del modelo "un gran EXE" son todas para el desarrollador, no para el usuario, esta idea tiene mucho sentido. –

+0

De hecho, eso es lo que estoy haciendo ahora, pero la razón por la que hice esta pregunta es porque tenía la impresión de que todo el mundo usa muchas DLL, pero aparentemente, todas las respuestas aquí también parecen preferir la solución EXE única. – Patrick

2

Un gran ejecutable es definitivamente beneficioso: puede tener una optimización de todo el programa y una menor sobrecarga y mantenimiento es mucho más simple.

En cuanto al tiempo de enlace, puede tener tanto "muchos archivos DLL" como "un archivo ejecutable grande" al mismo tiempo. Para cada DLL tiene una configuración de proyecto que construye una biblioteca estática. Entonces, cuando depura cosas, compila la configuración "DLL" del proyecto y cuando necesita enviarlo compila las configuraciones de "biblioteca estática" de sus proyectos. A veces tendrá un comportamiento diferente en diferentes configuraciones, pero esto tendrá que abordarse por incidente.

2

Una manera más fácil de mantener programas grandes es componerlos en partes manejables más pequeñas. Un programa se puede componer en un shell y módulos que agregan características al shell. Los grandes programas como Visual Studio, outlook usan todos los mismos conceptos. Pruebe este enfoque para hacer que los programas sean más sostenibles y robustos.

4

El principio es: reducir el número de su.Conjuntos NET al mínimo estricto. Tener un solo conjunto es el número ideal. Este es, por ejemplo, el caso de Reflector o NHibernate que ambos vienen como unos pocos conjuntos. Mi compañía publicó free two white books sobre el tema Uno de pequeño grande DLL ejecutable o muchos:

Los argumentos se desarrollan en estos blancos-libros vienen con motivos inválidos/válidos para crear un ensamblaje y un estudio de caso en el código base de la herramienta NDepend.

El problema es que MS fomenta (y aún fomenta) la idea de que los ensamblajes son componentes mientras que los ensamblajes son solo artefacto físico para empaquetar el código. La noción de componente es un artefacto lógico y normalmente un ensamblaje debe contener varios componentes. Es una buena idea dividir el componente con la noción de espacios de nombres, aunque no siempre es posible (especialmente en el caso de un marco con una API pública donde se usa el espacio de nombres para dividir la API y no necesariamente los componentes)

Cuestiones relacionadas