.net - qué - ¿Las aplicaciones con muchas DLL son algo malo?
que es un archivo dll y para que sirve (5)
Mi pregunta es: ¿hay algún inconveniente (rendimiento, mantenimiento, etc.) para tener una aplicación con muchos archivos DLL?
¿Un inconveniente con muchas DLLs? No
¿Un inconveniente con demasiados archivos DLL? Por supuesto.
Entonces, ¿cuántos son demasiado?
Un ensamblaje es un medio de organización, como espacios de nombres y clases. Los espacios de nombres definen límites lógicos, conjuntos de límites físicos.
Debe intentar mantener los ensamblajes coherentes y verlos como módulos del sistema.
Y sí, habría un (pequeño) problema de rendimiento si tuviera cientos de ellos. Pero con 40, no veo un problema.
Tenemos una aplicación web de empresa que consta de 4 componentes compilados (DLL). Hace más de un año, comenzamos a implementar componentes más granulares en un intento por aislar la funcionalidad, reducir el acoplamiento y reducir el riesgo de compilar y desplegar fragmentos masivos de código. Si bien nadie argumenta que este enfoque nos ha proporcionado MUCHA flexibilidad y velocidad mejoradas para comercializar al agregar nuevas funcionalidades y parchear errores, las aplicaciones ahora constan de casi 40 dlls. Tenemos una convención de nombres que funciona bien para identificar nuestros componentes.
Mi pregunta es: ¿hay algún inconveniente (rendimiento, mantenimiento, etc.) para tener una aplicación con muchos archivos DLL?
Edición: estamos explorando la opción de refactorizar el código en componentes más grandes que creo que podría ser una regresión de clases ...
El tipo de problemas que empeoran con más DLL son:
- Tiempos de compilación: el compilador se ejecuta una vez para cada DLL, y las DLL se deben copiar hacia y desde el directorio de salida
- Tiempos de carga: cada archivo DLL debe cargarse por separado en Windows, aunque los archivos DLL están cargados según la demanda, por lo que generalmente incurrirá en costos solo por las partes que usa
- Rebasar: cuanto más DLL tengas, mayor será la posibilidad de que dos colisionen en la memoria virtual. Esto no plantea un problema, porque Windows puede volver a generar uno de ellos, pero el proceso de rebasado lleva tiempo, y Windows debe cargar de antemano todas las páginas DLL afectadas desde el disco. La rebase no suele afectar mucho a las DLL administradas.
- Gastos generales de Visual Studio: una DLL = un proyecto = más trabajo para el IDE
El consejo que sigo es usar DLL para organizar su implementación y espacios de nombres para organizar su código. Si descubre que siempre libera un conjunto dado de DLL, también puede combinarlos.
Mantenimiento - no, rendimiento - si. Cuantos más ensamblajes deban cargarse, más lenta se iniciará la aplicación. Para cada ensamblaje que debe cargarse en el dominio de aplicación, el cargador debe realizar una serie de verificaciones.
No te olvides de ILMerge . Funciona bastante bien si desea las múltiples DLL para el desarrollo (diferentes proyectos) pero un EXE para la implementación (más rápido de cargar, más fácil de implementar).
La desventaja de ILMerge es que fallará en algunos escenarios de carga dinámica, por ejemplo, creando una instancia de un tipo por nombre (cadena). Por lo tanto, ILMerge puede o no ser viable, dependiendo de su proveedor de IoC.
Separar dominios funcionales independientes en DLL individuales es generalmente una buena cosa . Ayuda a introducir el potencial de reutilización y ayuda a mitigar la introducción de un acoplamiento inadecuado entre las implementaciones internas de las clases.
Sin embargo, existen inconvenientes en la introducción de múltiples ensamblajes como parte de un sistema:
- Se tarda más en cargar, verificar y JIT en varios ensamblajes. Sin embargo, esto rara vez es un problema, y en general no debería ser su principal preocupación al decidir cómo dividir la funcionalidad de una aplicación.
- Puede ser imprudente actualizar una aplicación implementando cambios dentro de un único ensamblaje. A menudo, dividir una aplicación en DLL separadas crea la impresión de que es posible arreglarla o mejorarla reemplazando solo algunos de sus ensamblajes. Si bien es ciertamente posible, puede introducir errores sutiles si hay cambios en los efectos secundarios o comportamientos no documentados de las clases y los métodos en esos ensamblajes.
- Puede ser más difícil entender un sistema que está dividido en demasiados ensamblajes. Las herramientas como ReSharper y CodeRush tienen algunas limitaciones al analizar el código dividido en varios ensamblajes.
- Puede animar a los desarrolladores a hacer más tipos públicos de lo que deberían. Dado que solo otros tipos públicos pueden ser consumidos y heredados por otros ensamblajes, un proyecto de múltiples ensamblajes puede resultar en más tipos públicos de los que pueden ser deseables.