¿Diferencia entre .dll y .exe?

91

Quiero saber la diferencia exacta entre el archivo dll y exe.

Umesh Aawte
fuente
1
Debería agregar algo de contexto aquí: ¿Es usted un principiante? ¿Está buscando algún tipo de especificación técnica profunda del material de educación física o algo más?
khebbie
3
Es cierto que soy principiante. Es una pregunta de entrevista etiquetada.
Umesh Aawte
Más importante aún, este es un duplicado que incluye uno (eliminado) por sakthivignesh ...
Marc Gravell

Respuestas:

71

EXE:

  1. Es un archivo ejecutable
  2. Al cargar un ejecutable, no se llama a la exportación, solo al punto de entrada del módulo.
  3. Cuando un sistema lanza un nuevo ejecutable, se crea un nuevo proceso
  4. El hilo de entrada se llama en el contexto del hilo principal de ese proceso.

DLL:

  1. Es una biblioteca de vínculos dinámicos
  2. Hay varios símbolos exportados.
  3. El sistema carga una DLL en el contexto de un proceso existente.

Para obtener más detalles: http://www.c-sharpcorner.com/Interviews/Answer/Answers.aspxQuestionId=1431&MajorCategoryId=1&MinorCategoryId=1 http://wiki.answers.com/Q/What_is_the_difference_between_an_EXE_and_a_DLL

Referencia: http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx

primer pulso
fuente
9
El sistema carga una DLL en un PROCESO existente, no en un hilo. Cada DLL en un proceso puede recibir una notificación cuando un hilo se inicia o se detiene, a través de una LibMainfunción.
Daniel Earwicker
13
Tus puntos 1 y 2 no son 100% correctos. Dado que puede usar LoadLibraryEx en un exe o dll, eso significa que puede usar GetProcAddress para cargar un punto de entrada desde un exe o dll. En ese sentido, los archivos exe y dll pueden vincularse dinámicamente y pueden tener cualquier número de puntos de entrada.
jussij
132

No sé por qué todos responden a esta pregunta en el contexto de .NET. La pregunta era general y no mencionaba .NET en ninguna parte.

Bueno, las principales diferencias son:

exe

  1. Un exe siempre se ejecuta en su propio espacio de direcciones, es decir, es un proceso separado.
  2. El propósito de un EXE es iniciar una aplicación propia por separado.

DLL

  1. Un dll siempre necesita un ejecutable de host para ejecutarse. es decir, nunca se puede ejecutar en su propio espacio de direcciones.
  2. El propósito de una DLL es tener una colección de métodos / clases que se puedan reutilizar desde alguna otra aplicación.
  3. DLL es la implementación de Microsoft de una biblioteca compartida.

El formato de archivo de DLL y exe es esencialmente el mismo. Windows reconoce la diferencia entre DLL y EXE a través del encabezado PE en el archivo. Para obtener más información sobre el encabezado PE, puede consultar este artículo en MSDN

Aamir
fuente
4
Entonces, si quisiera, podría cambiar el nombre y editar el encabezado del archivo para convertir una dll en un exe y viceversa.
RCIX
@RCIX: ¿Dudo que sea posible?
VoodooChild
Lo más probable es que no sea posible; consulte la respuesta de kichik a continuación.
Jonathon Reinhart
31

La diferencia es que un EXE tiene un punto de entrada, un método "principal" que se ejecutará en la ejecución.

El código dentro de una DLL debe llamarse desde otra aplicación.

Día de Robin
fuente
11
Esto es una carga incorrecta, implica que las DLL no tienen puntos de entrada. Las DLL pueden tener un punto de entrada DLLMain que se llama cuando (entre otras cosas) la DLL se carga en el proceso
jay.lee
29

Hay algunas diferencias más con respecto a la estructura que podría mencionar.

  1. Tanto DLL como EXE comparten la misma estructura de archivos: Portable Executable o PE. Para diferenciar entre los dos, uno puede mirar en el Characteristicsmiembro de IMAGE_FILE_HEADERadentro IMAGE_NT_HEADERS. Para una DLL, tiene el IMAGE_FILE_DLLindicador (0x2000) activado. Para un EXE, es la IMAGE_FILE_EXECUTABLE_IMAGEbandera (0x2).
  2. Los archivos PE constan de algunos encabezados y varias secciones. Generalmente hay una sección para el código, una sección para los datos, una sección que enumera las funciones importadas y una sección para los recursos. Algunas secciones pueden contener más de una cosa. El encabezado también describe una lista de directorios de datos que se encuentran en las secciones. Esos directorios de datos son los que permiten a Windows encontrar lo que necesita en el PE. Pero un tipo de directorio de datos que un EXE nunca tendrá (a menos que esté creando un frankenstein EXE) es el directorio de exportación. Aquí es donde los archivos DLL tienen una lista de funciones que exportan y pueden ser utilizados por otros archivos EXE o DLL. Por otro lado, cada DLL y EXE tiene un directorio de importación donde enumera las funciones y los archivos DLL que necesita para ejecutarse.
  3. También en los encabezados PE ( IMAGE_OPTIONAL_HEADER) está el ImageBasemiembro. Especifica la dirección virtual en la que el PE supone que se cargará. Si se carga en otra dirección, algunos indicadores podrían apuntar a la memoria incorrecta. Como los archivos EXE se encuentran entre los primeros en cargarse en su nuevo espacio de direcciones, el cargador de Windows puede asegurar una dirección de carga constante, que suele ser 0x00400000. Ese lujo no existe para una DLL. Dos archivos DLL cargados en el mismo proceso pueden solicitar la misma dirección. Es por eso que una DLL tiene otro directorio de datos llamado Base Relocation Directory que generalmente reside en su propia sección - .reloc. Este directorio contiene una lista de lugares en la DLL que necesitan ser modificados / parcheados para que apunten a la memoria correcta. La mayoría de los archivos EXE no tienen este directorio, pero algunos compiladores antiguos los generan.

Puede leer más sobre este tema en MSDN .

kichik
fuente
1
1. Como son banderas, ambas se pueden configurar a la vez. 2. Como dijiste, es posible pero prácticamente improbable. 3. ASLR también reubicará el exe, si puede. Entonces sí, incluso un exe puede tener reubicaciones. Con todo, los EXE que son DLL son posibles pero raros .
Desduplicador
20

Esta respuesta fue un poco más detallada de lo que pensaba, pero léala.

DLL:
en la mayoría de los casos, un archivo DLL es una biblioteca . Hay un par de tipos de bibliotecas, dinámicas y estáticas; lea acerca de la diferencia . DLL significa biblioteca de enlaces dinámicos que nos dice que es parte del programa pero no todo. Está hecho de componentes de software reutilizables ( biblioteca ) que puede usar para más de un programa . Tenga en cuenta que siempre es posible usar el código fuente de la biblioteca en muchas aplicaciones usando copiar y pegar, pero la idea de una biblioteca DLL / estática es que puede actualizar el código de una biblioteca y al mismo tiempo actualizar todas las aplicaciones usando it - sin compilar.

Por ejemplo:
Imagine que está creando un componente GUI de Windows como un botón . En la mayoría de los casos, querrá reutilizar el código que ha escrito porque es uncomponentecomplejo pero común . Quiere que muchas aplicaciones lo usen pero no quiere darles el código fuente. No puede copiarlo. -pegue el código del botón en cada programa, para que decida que desea crear una biblioteca DL (DLL) .

Esta biblioteca de "botones" es necesaria para EXE tablas de programación de para ejecutarse, y sin ella no se ejecutarán porque no saben cómo crear el botón, solo cómo hablar con él.

Asimismo, una DLL no se puede ejecutar, ejecutar, porque es solo una parte del programa, pero no tiene la información necesaria para crear un "proceso" .

EXE:
un ejecutable es el programa . Sabe crear un proceso y cómo comunicarse con la DLL. Se necesita la DLL para crear un botón, y sin que la aplicación no se ejecuta - ERROR.

espero que esto ayude....

Hannson
fuente
En el mundo del desarrollo .NET, cuando está importando cosas de otros módulos, como por ejemplo, en C # using SomeClassFromALibrary, ¿esa biblioteca está vinculada al proyecto a través de una DLL? Solo trato de ver si entiendo correctamente
Abdul
Normalmente usa la palabra clave usingpara espacios de nombres, no clases. La excepción está using staticdisponible en c # 6, que importa todos los miembros estáticos presentes en la clase especificada ( enlace ). La usingpalabra clave promete al compilador que en tiempo de ejecución habrá una biblioteca que contenga ese espacio de nombres . La biblioteca no está vinculada al proyecto a través de esa DLL, la DLL es la biblioteca que está vinculada al proyecto (ensamblado). Esa DLL contiene todo el código que se prometió en tiempo de compilación.
Darius
16

Tanto DLL como EXE son formatos ejecutables portátiles (PE)

Una biblioteca de vínculos dinámicos (DLL) es una biblioteca y, por lo tanto, no se puede ejecutar directamente. Si intenta ejecutarlo, obtendrá un error sobre un punto de entrada faltante. Necesita un punto de entrada (función principal) para ejecutarse, ese punto de entrada puede ser cualquier aplicación o exe. El enlace de DLL se produce en tiempo de ejecución. Es por eso que se llama biblioteca "Dynamic Link".

Un ejecutable (EXE) es un programa que se puede ejecutar. Tiene su propio punto de entrada. Una bandera dentro del encabezado PE indica qué tipo de archivo es (sin importar la extensión del archivo). El encabezado PE tiene un campo donde reside el punto de entrada del programa. En las DLL no se usa (o al menos no como punto de entrada).

Hay muchos programas disponibles para verificar la información del encabezado. La única diferencia que hace que ambos funcionen de manera diferente es el bit en el encabezado como se muestra en el diagrama a continuación.

encabezamiento

El archivo EXE tiene una sola entrada principal, lo que significa que es una aplicación aislada, cuando un sistema inicia un exe, se crea un nuevo proceso, mientras que las DLL tienen muchos puntos de entrada, por lo que cuando la aplicación lo usa, no se inicia un nuevo proceso, la DLL se puede reutilizar y versionar. DLL reduce el espacio de almacenamiento ya que diferentes programas pueden usar el mismo dll.

Zaheer Ahmed
fuente
3
Dices "Una bandera dentro del encabezado PE indica qué tipo de archivo es (irrelevante de la extensión del archivo)" --- Entonces, ¿eso significa si la extensión es importante .exeo .dllno? Es esa bandera en el encabezado lo que realmente los distingue ... Entonces, si hago un exey lo nombro a través de la interacción GUI como a .dll, pero luego cambio esa bandera manualmente, ¿aún se puede ejecutar?
Abdul
4

Dos cosas: la extensión y el indicador de encabezado almacenados en el archivo.

Ambos archivos son archivos PE. Ambos contienen exactamente el mismo diseño. Una DLL es una biblioteca y, por lo tanto, no se puede ejecutar. Si intenta ejecutarlo, obtendrá un error sobre un punto de entrada faltante. Un EXE es un programa que se puede ejecutar. Tiene un punto de entrada. Una bandera dentro del encabezado PE indica qué tipo de archivo es (sin importar la extensión del archivo). El encabezado PE tiene un campo donde reside el punto de entrada del programa. En las DLL no se utiliza (o al menos no como punto de entrada).

Una pequeña diferencia es que, en la mayoría de los casos, los archivos DLL tienen una sección de exportación donde se exportan los símbolos. Los EXE nunca deberían tener una sección de exportación, ya que no son bibliotecas, pero nada impide que eso suceda. Al cargador Win32 no le importa de ninguna manera.

Aparte de eso, son idénticos. Entonces, en resumen, los EXE son programas ejecutables, mientras que las DLL son bibliotecas cargadas en un proceso y contienen algún tipo de funcionalidad útil como seguridad, acceso a la base de datos o algo así.

Judy Smith
fuente
3
+1: Pocas personas se dan cuenta de que, técnicamente, la diferencia es solo un poco en el encabezado PE
Serge Wautier
Me pregunto qué pasaría en una entrevista si respondieras de esa manera. Ellos: "¿Cuál es la diferencia entre un DLL y un EXE?" Tú: "One Bit".
JMI MADISON
4

Dll v / s Exe

1) El archivo DLL es una biblioteca de vínculos dinámicos que se puede utilizar en archivos exe y otros archivos dll.
El archivo EXE es un archivo ejecutable que se ejecuta en un proceso separado que es administrado por el sistema operativo.

2) Las DLL no se pueden ejecutar directamente. Son archivos separados que contienen funciones que pueden ser invocadas por programas y otras DLL para realizar cálculos y funciones.
Un EXE es un programa que se puede ejecutar. Ej: programa de Windows

3)
DLL de reutilización : se pueden reutilizar para alguna otra aplicación. Siempre que el codificador conozca los nombres y parámetros de las funciones y procedimientos en el archivo DLL.
EXE: solo para fines específicos.

4) Una DLL compartiría el mismo proceso y espacio de memoria de la aplicación que llama, mientras que un
EXE crea su proceso y espacio de memoria separados.

5) Utiliza
DLL: desea que muchas aplicaciones lo usen, pero no desea darles el código fuente. No puede copiar y pegar el código del botón en todos los programas, por lo que decide que desea crear un DL- Biblioteca (DLL).

EXE: cuando trabajamos con plantillas de proyectos como aplicaciones de Windows Forms, aplicaciones de consola, aplicaciones WPF y servicios de Windows, generan un ensamblado exe cuando se compilan.

6) Similitudes:
Tanto DLL como EXE son archivos binarios que tienen una estructura anidada compleja definida por el formato Portable Executable, y no están diseñados para que los usuarios puedan editarlos.

skanda93
fuente
2

El .exe es el programa. El .dll es una biblioteca a la que puede llamar un .exe (u otro .dll).

Lo que dice sakthivignesh puede ser cierto en que un .exe puede usar otro como si fuera una biblioteca, y esto se hace (por ejemplo) con algunos componentes COM. En este caso, el .exe "esclavo" es un programa separado (estrictamente hablando, un proceso separado - quizás ejecutándose en una máquina separada), pero uno que acepta y maneja solicitudes de otros programas / componentes / lo que sea.

Sin embargo, si solo elige un .exe y .dll al azar de una carpeta en sus Archivos de programa, es probable que COM no sea relevante: son solo un programa y sus bibliotecas vinculadas dinámicamente.

Con las API de Win32, un programa puede cargar y utilizar una DLL mediante las funciones de API LoadLibrary y GetProcAddress, IIRC. Había funciones similares en Win16.

COM es en muchos sentidos una evolución de la idea de DLL, originalmente concebida como la base de OLE2, mientras que .NET es el descendiente de COM. Las DLL han existido desde Windows 1, IIRC. Originalmente, eran una forma de compartir código binario (particularmente API del sistema) entre múltiples programas en ejecución para minimizar el uso de memoria.

Steve314
fuente
2

Un EXE es visible para el sistema como un ejecutable Win32 normal. Su punto de entrada se refiere a un pequeño cargador que inicializa el tiempo de ejecución de .NET y le dice que cargue y ejecute el ensamblado contenido en el EXE. Una DLL es visible para el sistema como una DLL de Win32, pero probablemente sin puntos de entrada. El tiempo de ejecución de .NET almacena información sobre el ensamblado contenido en su propio encabezado.

dll es una colección de funciones reutilizables donde, como .exe, es un ejecutable que puede llamar a estas funciones

rahul
fuente
1
El tiempo de ejecución de .NET no tiene nada que ver con .exe o .dll, son archivos de código de máquina binarios (si se producen en algún lenguaje de programación que utiliza el tiempo de ejecución de .NET, entonces el tiempo de ejecución de .NET está involucrado, pero eso ya es responsabilidad del exe en sí mismo, no en el cargador del sistema operativo).
Ped7g
1

Un exe es un programa ejecutable, mientras que una DLL es un archivo que los programas pueden cargar y ejecutar de forma dinámica.

Bhushan Bhangale
fuente
6
Alguien probablemente sintió que su respuesta no era lo suficientemente detallada.
JesperE
sí, es posible que la gente no sepa qué es un programa ejecutable, y eso se convierte en una pregunta completamente nueva.
Mindless
1

● .exe y dll son la versión compilada del código c # que también se denominan ensamblados.

● .exe es un archivo ejecutable independiente, lo que significa que se puede ejecutar directamente.

● .dll es un componente reutilizable que no se puede ejecutar directamente y requiere de otros programas para ejecutarlo.

Kedarnath MS
fuente
0

Diferencia en DLL y EXE:

1) DLL es un componente en proceso, lo que significa que se ejecuta en el mismo espacio de memoria que el proceso del cliente. EXE es un componente de proceso externo, lo que significa que se ejecuta en su propio espacio de memoria separado.

2) La DLL contiene funciones y procedimientos que otros programas pueden usar (promueve la confiabilidad) mientras que EXE no se puede compartir con otros programas.

3) DLL no se puede ejecutar directamente, ya que están diseñados para ser cargados y ejecutados por otros programas. EXE es un programa que se ejecuta directamente.

Rahul Sharma
fuente
-1

Por favor comente mientras vota en contra.

Para aquellos que buscan una respuesta concisa,

  • Si un ensamblado se compila como una biblioteca de clases y proporciona tipos para que los usen otros ensamblados, entonces tiene la extensión ifle .dll (biblioteca de vínculos dinámicos) y no se puede ejecutar de forma independiente.

  • Del mismo modo, si un ensamblado se compila como una aplicación, entonces tiene la extensión de archivo .exe(ejecutable) y se puede ejecutar de forma independiente. Antes de .NET Core 3.0, las aplicaciones de consola se compilaban en archivos .dll y tenían que ser ejecutadas por el comando dotnet run o un ejecutable de host. - fuente

snr
fuente
-2

La principal diferencia exacta entre DLL y EXE es que DLL no tiene un punto de entrada y EXE sí. Si está familiarizado con c ++, puede ver que build EXE tiene la función de entrada main () y DLL no :)

faya
fuente