¿Qué son exactamente los archivos DLL y cómo funcionan?


224

¿Cómo funcionan exactamente los archivos DLL? Parece que hay un montón de ellos, pero no sé qué son ni cómo funcionan.

Entonces, ¿cuál es el trato con ellos?


66
Dado que esto solo está etiquetado con Windows, y esta pregunta se escribió en 2008, vale la pena mencionar que hoy en día los dll también se ejecutan en Mac y Linux con .NET Core.
Jim Aho

Respuestas:


287

¿Qué es una DLL?

Las bibliotecas de enlaces dinámicos (DLL) son como EXE pero no son directamente ejecutables. Son similares a los archivos .so en Linux / Unix. Es decir, las DLL son la implementación de MS de bibliotecas compartidas.

Las DLL son tan parecidas a un EXE que el formato de archivo en sí es el mismo. Tanto EXE como DLL se basan en el formato de archivo Portable Executable (PE). Las DLL también pueden contener componentes COM y bibliotecas .NET.

¿Qué contiene una DLL?

Una DLL contiene funciones, clases, variables, IU y recursos (como iconos, imágenes, archivos, ...) que utiliza un EXE u otra DLL.

Tipos de bibliotecas:

En prácticamente todos los sistemas operativos, hay 2 tipos de bibliotecas. Bibliotecas estáticas y bibliotecas dinámicas. En Windows, las extensiones de archivo son las siguientes: bibliotecas estáticas (.lib) y bibliotecas dinámicas (.dll). La principal diferencia es que las bibliotecas estáticas están vinculadas al ejecutable en tiempo de compilación; mientras que las bibliotecas dinámicas vinculadas no están vinculadas hasta el tiempo de ejecución.

Más sobre bibliotecas estáticas y dinámicas:

Sin embargo, normalmente no ve bibliotecas estáticas en su computadora, porque una biblioteca estática está incrustada directamente dentro de un módulo (EXE o DLL). Una biblioteca dinámica es un archivo independiente.

Una DLL se puede cambiar en cualquier momento y solo se carga en tiempo de ejecución cuando un EXE carga explícitamente la DLL. Una biblioteca estática no se puede cambiar una vez que se compila dentro del EXE. Una DLL se puede actualizar individualmente sin actualizar el propio EXE.

Cargando una DLL:

Un programa carga una DLL al inicio, a través de Win32 API LoadLibrary, o cuando es una dependencia de otra DLL. Un programa usa GetProcAddress para cargar una función o LoadResource para cargar un recurso.

Otras lecturas:

Por favor, consulte MSDN o Wikipedia para leer más. También las fuentes de esta respuesta.


55
Probablemente debería mencionar la importación de lib en alguna parte. Ok, me iré ahora. :)
Adam Mitz

2
Eliminado los que parecen ser abordados. ¿Cómo obtengo puntos por esto? <g>
Adam Mitz

36

¿Qué es una DLL?

Los archivos DLL son archivos binarios que pueden contener código ejecutable y recursos como imágenes, etc.

¿Son importantes?

La mayoría de las aplicaciones cargarán los archivos DLL que requieren al inicio. Si no se encuentra alguno de estos, el sistema no podrá iniciar el proceso.

Los archivos DLL pueden requerir otros archivos DLL

De la misma manera que una aplicación requiere un archivo DLL, un archivo DLL puede depender de otros archivos DLL. Si no se encuentra uno de estos archivos DLL en la cadena de dependencia, la aplicación no se cargará. Esto se depura fácilmente utilizando cualquier herramienta de caminante de dependencias, como Dependency Walker .

Hay muchos de ellos en las carpetas del sistema.

La mayor parte de la funcionalidad del sistema está expuesta a un programa de usuario en forma de archivos DLL, ya que son una forma estándar de compartir código / recursos. Cada funcionalidad se mantiene por separado en diferentes archivos DLL para que solo se carguen los archivos DLL necesarios y, por lo tanto, se reduzcan las restricciones de memoria en el sistema.

Las aplicaciones instaladas también usan archivos DLL

Los archivos DLL también se convierten en una forma de separar funcionalidades físicamente como se explicó anteriormente. Las buenas aplicaciones también intentan no cargar los archivos DLL hasta que sean absolutamente necesarios, lo que reduce los requisitos de memoria. Esto también hace que las aplicaciones se envíen con muchos archivos DLL.

DLL Hell

Sin embargo, a veces las actualizaciones del sistema a menudo rompen otros programas cuando hay una discrepancia de versión entre los archivos DLL compartidos y el programa que los requiere. Los puntos de control del sistema y el caché de DLL, etc. han sido las iniciativas de M $ para resolver este problema. La plataforma .NET podría no enfrentar este problema en absoluto.

¿Cómo sabemos qué hay dentro de un archivo DLL?

Debe usar una herramienta externa como DUMPBIN o Dependency Walker que no solo mostrará qué funciones visibles públicamente (conocidas como exportaciones) están contenidas dentro de los archivos DLL y también qué otros archivos DLL requiere y qué exportaciones de esos archivos DLL este archivo DLL depende de

¿Cómo los creamos / usamos?

Consulte la documentación de programación de su proveedor. Para C ++, consulte LoadLibrary en MSDN.


2
Complete esta oración ( "The .NET platform might not face this issue at all.") con un por qué. Gracias.
Jogi

1
@RehanKhan Comenzando con .NET Framework v2.0, el tiempo de ejecución solo cargará ensamblados compilados con una versión de .NET <= tiempo de ejecución actualmente cargado. utilizará el ensamblaje ya cargado. Con todo, creo que es mejor decir que resolvieron el problema aplicando restricciones muy estrictas sobre qué archivos DLL cargará el tiempo de ejecución de un programa (antes de que simplemente se rinda y solicite su ayuda).
Vladislav Martin

14

Digamos que está haciendo un ejecutable que utiliza algunas funciones que se encuentran en una biblioteca.

Si la biblioteca que está utilizando es estática , el vinculador copiará el código objeto para estas funciones directamente desde la biblioteca y los insertará en el ejecutable.

Ahora, si se ejecuta este ejecutable, tiene todo lo que necesita, por lo que el cargador ejecutable solo lo carga en la memoria y lo ejecuta.

Si la biblioteca es dinámica, el enlazador no insertará código objeto sino que insertará un código auxiliar que básicamente dice que esta función se encuentra en esta DLL en esta ubicación.

Ahora, si se ejecuta este ejecutable, faltan bits del ejecutable (es decir, los apéndices), de modo que el cargador pasa por el ejecutable arreglando los apéndices faltantes. Solo después de que se hayan resuelto todos los apéndices, se permitirá que se ejecute el ejecutable.

Para ver esto en acción, elimine o cambie el nombre de la DLL y observe cómo el cargador informará de un error de DLL faltante cuando intente ejecutar el ejecutable.

De ahí el nombre de Dynamic Link Library , partes del proceso de vinculación se realizan dinámicamente en tiempo de ejecución por el cargador ejecutable.

Una nota final, si no se vincula a la DLL, entonces el vinculador no insertará ningún código auxiliar , pero Windows aún proporciona la API GetProcAddress que le permite cargar y ejecutar el punto de entrada de la función DLL mucho después de que el ejecutable haya comenzado.


12

Las DLL (bibliotecas de enlaces dinámicos) y las SL (bibliotecas compartidas, equivalentes en UNIX) son solo bibliotecas de código ejecutable que pueden vincularse dinámicamente en un ejecutable en el momento de la carga.

Las bibliotecas estáticas se insertan en un ejecutable en tiempo de compilación y se arreglan desde ese punto. Aumentan el tamaño del ejecutable y no se pueden compartir.

Las bibliotecas dinámicas tienen las siguientes ventajas:

1 / Se cargan en tiempo de ejecución en lugar de en tiempo de compilación para que puedan actualizarse independientemente del ejecutable (todas esas elegantes ventanas y cuadros de diálogo que ve en Windows provienen de archivos DLL para que la apariencia de su aplicación pueda cambiar sin usted tener que reescribirlo).

2 / Debido a que son independientes, el código se puede compartir a través de múltiples ejecutables; esto ahorra memoria ya que, si está ejecutando 100 aplicaciones con una sola DLL, es posible que solo haya una copia de la DLL en la memoria.

Su principal desventaja es la ventaja n. ° 1: hacer que las DLL cambien independientemente de su aplicación puede hacer que su aplicación deje de funcionar o comience a comportarse de una manera extraña. El control de versiones de DLL tiende a no administrarse muy bien en Windows y esto lleva al pintoresco "Infierno de DLL".


11

Los archivos DLL contienen una tabla de exportación que es una lista de símbolos que el programa de llamada puede buscar. Los símbolos son típicamente funciones con la convención de llamada C ( __stcall ). La tabla de exportación también contiene la dirección de la función.

Con esta información, el programa que realiza la llamada puede llamar a las funciones dentro de la DLL a pesar de que no tenía acceso a la DLL en el momento de la compilación.

La introducción de las bibliotecas de enlaces dinámicos tiene más información.


6

http://support.microsoft.com/kb/815065

Una DLL es una biblioteca que contiene código y datos que pueden ser utilizados por más de un programa al mismo tiempo. Por ejemplo, en los sistemas operativos Windows, la DLL Comdlg32 realiza funciones relacionadas con cuadros de diálogo comunes. Por lo tanto, cada programa puede usar la funcionalidad contenida en esta DLL para implementar un cuadro de diálogo Abrir. Esto ayuda a promover la reutilización del código y el uso eficiente de la memoria.

Al usar una DLL, un programa puede modularizarse en componentes separados. Por ejemplo, un programa de contabilidad puede venderse por módulo. Cada módulo se puede cargar en el programa principal en tiempo de ejecución si ese módulo está instalado. Debido a que los módulos están separados, el tiempo de carga del programa es más rápido y un módulo solo se carga cuando se solicita esa funcionalidad.

Además, las actualizaciones son más fáciles de aplicar a cada módulo sin afectar otras partes del programa. Por ejemplo, puede tener un programa de nómina y las tasas de impuestos cambian cada año. Cuando estos cambios están aislados en una DLL, puede aplicar una actualización sin necesidad de compilar o instalar todo el programa nuevamente.

http://en.wikipedia.org/wiki/Dynamic-link_library


2

DLL es un formato de archivo de extensión de archivo conocido como "biblioteca de enlaces dinámicos" que se utiliza para contener múltiples códigos y procedimientos para programas de Windows. Software & Games se ejecuta sobre la base de archivos DLL; Los archivos DLL se crearon para que varias aplicaciones pudieran usar su información al mismo tiempo.

SI desea obtener más información sobre los archivos DLL o enfrenta algún error, lea la siguiente publicación. https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1

Las DLL (bibliotecas de enlaces dinámicos) contienen recursos utilizados por una o más aplicaciones o servicios. Pueden contener clases, iconos, cadenas, objetos, interfaces y casi cualquier cosa que un desarrollador necesite almacenar, excepto una IU.


3
De hecho, pueden almacenar una interfaz de usuario y varios programas hacen esto. Por ejemplo complementos.
Brian R. Bondy el

1

De acuerdo con Microsoft

(DLL) Las bibliotecas de enlaces dinámicos son archivos que contienen datos, códigos o recursos necesarios para la ejecución de aplicaciones. Estos son archivos creados por el ecosistema de Windows y se pueden compartir entre dos o más aplicaciones.

Cuando un programa o software se ejecuta en Windows, gran parte del funcionamiento de la aplicación depende de los archivos DLL del programa. Por ejemplo, si una aplicación en particular tenía varios módulos, los archivos DLL de Windows determinan cómo interactúa cada módulo entre sí.

Si desea una explicación detallada, consulte estos recursos útiles

Qué son los archivos dll , Acerca de los archivos dll

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.