Diferença entre .dll e .exe?


91

Eu quero saber a diferença exata entre o arquivo DLL e exe.


1
Você deve adicionar algum contexto aqui: Você é um iniciante? Você está procurando algum tipo de especificação técnica profunda das coisas de PE? Ou algo mais
khebbie

3
É verdade que sou iniciante. É uma pergunta de entrevista conforme marcada.
Umesh Aawte

Mais importante, esta é uma duplicata incluindo uma (excluída) por sakthivignesh ...
Marc Gravell

Respostas:


71

EXE:

  1. É um arquivo executável
  2. Ao carregar um executável, nenhuma exportação é chamada, mas apenas o ponto de entrada do módulo.
  3. Quando um sistema lança um novo executável, um novo processo é criado
  4. O thread de entrada é chamado no contexto do thread principal desse processo.

DLL:

  1. É uma biblioteca de links dinâmicos
  2. Existem vários símbolos exportados.
  3. O sistema carrega uma DLL no contexto de um processo existente.

Para obter mais detalhes: 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

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


9
O sistema carrega uma DLL em um PROCESS existente, não em um thread. Cada DLL em um processo pode receber uma notificação quando um thread é iniciado ou interrompido, por meio de uma LibMainfunção.
Daniel Earwicker

13
Seus pontos 1 e 2 não estão 100% corretos. Uma vez que você pode usar LoadLibraryEx em um exe ou dll, isso significa que você pode usar GetProcAddress para carregar um ponto de entrada de um exe ou dll. Portanto, a esse respeito, os arquivos exe e dll podem ser vinculados dinamicamente e podem ter qualquer número de pontos de entrada.
jussij

131

Não sei por que todo mundo está respondendo a essa pergunta no contexto do .NET. A pergunta era geral e não mencionava .NET em lugar nenhum.

Bem, as principais diferenças são:

Exe

  1. Um exe sempre é executado em seu próprio espaço de endereço, ou seja, é um processo separado.
  2. O objetivo de um EXE é lançar um aplicativo separado próprio.

DLL

  1. Uma dll sempre precisa de um exe host para ser executada. ou seja, ele nunca pode ser executado em seu próprio espaço de endereço.
  2. O objetivo de uma DLL é ter uma coleção de métodos / classes que podem ser reutilizados a partir de algum outro aplicativo.
  3. DLL é a implementação da Microsoft de uma biblioteca compartilhada.

O formato de arquivo DLL e exe é essencialmente o mesmo. O Windows reconhece a diferença entre DLL e EXE por meio do cabeçalho PE no arquivo. Para obter detalhes sobre o cabeçalho PE, consulte este artigo no MSDN


4
Então, se você quiser, pode renomear e editar o cabeçalho do fikle para transformar uma dll em um exe e vice-versa?
RCIX

@RCIX: Duvido que isso seja possível?
VoodooChild

Provavelmente não é possível - veja a resposta de kichik abaixo.
Jonathon Reinhart,

31

A diferença é que um EXE possui um ponto de entrada, um método "principal" que será executado na execução.

O código dentro de uma DLL precisa ser chamado de outro aplicativo.


11
Isso é misloading, significa que DLLs não têm pontos de entrada. As DLLs podem ter um ponto de entrada DLLMain que é chamado quando (entre outras coisas) a DLL é carregada no processo
jay.lee

29

Existem mais algumas diferenças em relação à estrutura que você poderia mencionar.

  1. Tanto o DLL quanto o EXE compartilham a mesma estrutura de arquivos - Portable Executable ou PE. Para diferenciar os dois, pode-se olhar no Characteristicsmembro de IMAGE_FILE_HEADERdentro IMAGE_NT_HEADERS. Para uma DLL, ele tem o IMAGE_FILE_DLLsinalizador (0x2000) ativado. Para um EXE, é o IMAGE_FILE_EXECUTABLE_IMAGEsinalizador (0x2).
  2. Os arquivos PE consistem em alguns cabeçalhos e várias seções. Geralmente, há uma seção para código, uma seção para dados, uma seção que lista funções importadas e uma seção para recursos. Algumas seções podem conter mais de um item. O cabeçalho também descreve uma lista de diretórios de dados localizados nas seções. Esses diretórios de dados são o que permite ao Windows encontrar o que precisa no PE. Mas um tipo de diretório de dados que um EXE nunca terá (a menos que você esteja criando um EXE frankenstein) é o diretório de exportação. É aqui que os arquivos DLL têm uma lista de funções que exportam e podem ser usados ​​por outros arquivos EXE ou DLL. Por outro lado, cada DLL e EXE possui um diretório de importação onde lista as funções e arquivos DLL necessários para sua execução.
  3. Também nos cabeçalhos PE ( IMAGE_OPTIONAL_HEADER) está o ImageBasemembro. Ele especifica o endereço virtual no qual o PE assume que será carregado. Se for carregado em outro endereço, alguns ponteiros podem apontar para a memória errada. Como os arquivos EXE estão entre os primeiros a serem carregados em seu novo espaço de endereço, o carregador do Windows pode garantir um endereço de carregamento constante e normalmente é 0x00400000. Esse luxo não existe para um DLL. Dois arquivos DLL carregados no mesmo processo podem solicitar o mesmo endereço. É por isso que uma DLL tem outro diretório de dados chamado Base Relocation Directory que geralmente reside em sua própria seção - .reloc. Este diretório contém uma lista de locais na DLL que precisam ser realocados / corrigidos para que apontem para a memória correta. A maioria dos arquivos EXE não tem esse diretório, mas alguns compiladores antigos os geram.

Você pode ler mais sobre este tópico no MSDN .


1
1. Como essas são bandeiras, ambas podem ser definidas ao mesmo tempo. 2. Como você disse, é possível, mas muito improvável. 3. ASLR irá realocar o exe também, se possível. Então, sim, até mesmo um exe pode ser realocado. Em suma, EXEs que são DLLs são possíveis, mas raros .
Deduplicator

20

Essa resposta foi um pouco mais detalhada do que eu pensava, mas li.

DLL:
na maioria dos casos, um arquivo DLL é uma biblioteca . Existem alguns tipos de bibliotecas, dinâmicas e estáticas - leia sobre a diferença . DLL significa biblioteca de vínculo dinâmico, que nos diz que é uma parte do programa, mas não é a coisa toda. É feito de componentes de software reutilizáveis ​​( biblioteca ) que você pode usar para mais de um programa . Lembre-se que sempre é possível usar o código-fonte da biblioteca em muitos aplicativos usando copiar e colar, mas a ideia de uma DLL / Biblioteca Estática é que você possa atualizar o código de uma biblioteca e ao mesmo tempo atualizar todos os aplicativos usando -lo - sem compilar.

Por exemplo:
imagine que você está criando um componente GUI do Windows como um botão . Na maioria dos casos, você deseja reutilizar o código que escreveu porque é um componente complexo, mas comum - você deseja que muitos aplicativos o usem, mas não deseja fornecer o código-fonte que você não pode copiar -Cole o código do botão em cada programa, para decidir que deseja criar uma Biblioteca DL (DLL) .

Esta biblioteca de "botões" é necessária para os executáveis ​​EXE executáveis , e sem ela eles não funcionarão porque não sabem como criar o botão, apenas como falar com ele.

Da mesma forma, uma DLL não pode ser executada - execute, porque é apenas uma parte do programa, mas não possui as informações necessárias para criar um "processo" .

EXE:
um executável é o programa . Ele sabe como criar um processo e como se comunicar com a DLL. Ele precisa da DLL para criar um botão, e sem ela o aplicativo não funciona - ERROR.

espero que isto ajude....


No mundo do desenvolvimento .NET, quando você importa coisas de outros módulos, como por exemplo, em C # using SomeClassFromALibrary, essa biblioteca está vinculada ao projeto por meio de uma DLL? Só estou tentando ver se estou entendendo corretamente
Abdul

Você normalmente usa a palavra-chave usingpara namespaces, não classes. A exceção está using staticdisponível no c # 6, que importa todos os membros estáticos presentes na classe especificada ( link ). A usingpalavra-chave promete ao compilador que, em tempo de execução, haverá uma biblioteca contendo aquele namespace . A biblioteca não está vinculada ao projeto por meio dessa DLL, a DLL é a biblioteca vinculada ao projeto (montagem). Essa DLL contém todo o código que foi prometido em tempo de compilação.
Darius

16

DLL e EXE são formatos executáveis ​​portáteis (PE)

Uma biblioteca de vínculo dinâmico (DLL) é uma biblioteca e, portanto, não pode ser executada diretamente. Se você tentar executá-lo, obterá um erro sobre um ponto de entrada ausente. Ele precisa de um ponto de entrada (função principal) para ser executado, esse ponto de entrada pode ser qualquer aplicativo ou exe. A vinculação de DLL ocorre em tempo de execução. Por isso é chamada de biblioteca "Dynamic Link".

Um executável (EXE) é um programa que pode ser executado. Ele tem seu próprio ponto de entrada. Um sinalizador dentro do cabeçalho PE indica que tipo de arquivo é (irrelevante da extensão do arquivo). O cabeçalho PE possui um campo onde reside o ponto de entrada para o programa. Em DLLs, ele não é usado (ou pelo menos não como um ponto de entrada).

Existem muitos softwares disponíveis para verificar as informações do cabeçalho. A única diferença que faz com que ambos funcionem de maneira diferente é o bit no cabeçalho, conforme mostrado no diagrama abaixo.

cabeçalho

O arquivo EXE tem apenas uma única entrada principal, o que significa que é um aplicativo isolado; quando um sistema inicia o exe, um novo processo é criado enquanto as DLLs têm muitos pontos de entrada, portanto, quando o aplicativo o usa, nenhum novo processo é iniciado, a DLL pode ser reutilizada e ter sua versão alterada. A DLL reduz o espaço de armazenamento, pois diferentes programas podem usar a mesma DLL.


3
Você diz "Uma bandeira dentro do cabeçalho PE indica que tipo de arquivo é (irrelevante da extensão do arquivo)" --- Então isso significa se a extensão é .exeou .dllnão importa? É esse sinalizador no cabeçalho que realmente os distingue ... Então, se eu fizer um exee nomeá-lo por meio da interação da GUI como um .dll, mas alterar esse sinalizador manualmente, ele ainda pode ser executado?
Abdul

4

Duas coisas: a extensão e o sinalizador de cabeçalho armazenados no arquivo.

Ambos os arquivos são arquivos PE. Ambos contêm exatamente o mesmo layout. Uma DLL é uma biblioteca e, portanto, não pode ser executada. Se você tentar executá-lo, obterá um erro sobre um ponto de entrada ausente. Um EXE é um programa que pode ser executado. Tem um ponto de entrada. Um sinalizador dentro do cabeçalho PE indica qual tipo de arquivo é (irrelevante para a extensão do arquivo). O cabeçalho PE possui um campo onde reside o ponto de entrada para o programa. Em DLLs, ele não é usado (ou pelo menos não como um ponto de entrada).

Uma pequena diferença é que, na maioria dos casos, as DLLs têm uma seção de exportação onde os símbolos são exportados. EXEs nunca devem ter uma seção de exportação, pois não são bibliotecas, mas nada impede que isso aconteça. O carregador Win32 não se importa de qualquer maneira.

Fora isso, eles são idênticos. Portanto, em resumo, EXEs são programas executáveis, enquanto DLLs são bibliotecas carregadas em um processo e contêm algum tipo de funcionalidade útil como segurança, acesso a banco de dados ou algo assim.


3
+1: Poucas pessoas percebem que, tecnicamente, a diferença é apenas um pouco no cabeçalho PE
Serge Wautier,

Eu me pergunto o que aconteceria em uma entrevista se você respondesse dessa forma. Eles: "Qual é a diferença entre uma DLL e um EXE?" Você: "One Bit".
JMI MADISON

4

Dll v / s Exe

1) O arquivo DLL é uma biblioteca de vínculo dinâmico que pode ser usada em arquivos exe e outros arquivos DLL.
O arquivo EXE é um arquivo executável executado em um processo separado gerenciado pelo sistema operacional.

2) DLLs não são executáveis ​​diretamente. Eles são arquivos separados que contêm funções que podem ser chamadas por programas e outras DLLs para realizar cálculos e funções.
Um EXE é um programa que pode ser executado. Ex: programa Windows

3)
DLL de reutilização : Eles podem ser reutilizados para algum outro aplicativo. Desde que o codificador conheça os nomes e parâmetros das funções e procedimentos do arquivo DLL.
EXE: apenas para fins específicos.

4) Uma DLL compartilharia o mesmo processo e espaço de memória do aplicativo de chamada, enquanto um
EXE cria seu processo separado e espaço de memória.

5) Usa
DLL: você deseja que muitos aplicativos o utilizem, mas não deseja fornecer o código-fonte a eles. Você não pode copiar e colar o código do botão em todos os programas, então decide que deseja criar um DL- Biblioteca (DLL).

EXE: Quando trabalhamos com modelos de projeto como aplicativos de formulários do Windows, aplicativos de console, aplicativos WPF e serviços do Windows, eles geram um assembly exe quando compilados.

6) Semelhanças:
Tanto o DLL quanto o EXE são arquivos binários com uma estrutura aninhada complexa definida pelo formato executável portátil e não se destinam a ser editados pelos usuários.


2

O .exe é o programa. O .dll é uma biblioteca que um .exe (ou outro .dll) pode chamar.

O que sakthivignesh diz pode ser verdade porque um .exe pode usar outro como se fosse uma biblioteca, e isso é feito (por exemplo) com alguns componentes COM. Neste caso, o "escravo" .exe é um programa separado (estritamente falando, um processo separado - talvez rodando em uma máquina separada), mas um que aceita e manipula solicitações de outros programas / componentes / qualquer coisa.

No entanto, se você apenas escolher um .exe e .dll aleatórios de uma pasta em seus Arquivos de Programas, provavelmente o COM não será relevante - eles são apenas um programa e suas bibliotecas vinculadas dinamicamente.

Usando APIs do Win32, um programa pode carregar e usar uma DLL usando as funções de API LoadLibrary e GetProcAddress, IIRC. Havia funções semelhantes no Win16.

COM é, em muitos aspectos, uma evolução da ideia de DLL, originalmente concebida como a base para OLE2, enquanto .NET é descendente de COM. DLLs existem desde o Windows 1, IIRC. Eles eram originalmente uma forma de compartilhar código binário (particularmente APIs do sistema) entre vários programas em execução para minimizar o uso de memória.


2

Um EXE é visível para o sistema como um executável Win32 normal. Seu ponto de entrada se refere a um pequeno carregador que inicializa o runtime do .NET e o informa para carregar e executar o assembly contido no EXE. Uma DLL é visível para o sistema como uma DLL Win32, mas provavelmente sem nenhum ponto de entrada. O runtime .NET armazena informações sobre o assembly contido em seu próprio cabeçalho.

dll é uma coleção de funções reutilizáveis ​​onde, como um .exe, é um executável que pode chamar essas funções


1
O tempo de execução .NET não tem nada a ver com .exe ou .dll, eles são arquivos de código de máquina binários (se forem produzidos em alguma linguagem de programação que use o tempo de execução .NET, então o tempo de execução .NET está envolvido, mas isso já é responsabilidade do código exe em si, não carregador de SO).
Ped7g

1

Um exe é um programa executável, enquanto uma DLL é um arquivo que pode ser carregado e executado por programas dinamicamente.


6
Alguém provavelmente sentiu que sua resposta não foi detalhada o suficiente.
JesperE de

sim, as pessoas podem não saber o que é um programa executável, e isso se torna uma questão totalmente nova.
Mindless

1

● .exe e dll são a versão compilada do código c #, também chamada de assemblies.

● .exe é um arquivo executável autônomo, o que significa que pode ser executado diretamente.

● .dll é um componente reutilizável que não pode ser executado diretamente e requer outros programas para executá-lo.


0

Diferença em DLL e EXE:

1) DLL é um componente em processo, o que significa que é executado no mesmo espaço de memória que o processo do cliente. EXE é um componente fora do processo, o que significa que é executado em seu próprio espaço de memória separado.

2) A DLL contém funções e procedimentos que outros programas podem usar (promove a reutilização), enquanto EXE não pode ser compartilhado com outros programas.

3) DLL não pode ser executado diretamente, pois foi projetado para ser carregado e executado por outros programas. EXE é um programa executado diretamente.


-1

Por favor, comente enquanto votar.

Para quem procura uma resposta concisa,

  • Se um assembly for compilado como uma biblioteca de classes e fornecer tipos para serem usados ​​por outros assemblies, ele terá a extensão ifle .dll (biblioteca de vínculo dinâmico) e não poderá ser executado de forma autônoma.

  • Da mesma forma, se um assembly for compilado como um aplicativo, ele .exeterá a extensão de arquivo (executável) e poderá ser executado de forma independente. Antes do .NET Core 3.0, os aplicativos de console eram compilados em arquivos .dll e tinham que ser executados pelo comando dotnet run ou por um executável host. - Fonte


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.