O que exatamente são os arquivos DLL e como eles funcionam?

224

Como exatamente os arquivos DLL funcionam? Parece haver muitos deles, mas não sei o que são ou como funcionam.

Então, qual é o problema com eles?

stalepretzel
fonte
6
Como isso só é marcado com o Windows, e essa pergunta foi escrita em 2008, vale a pena mencionar que atualmente as dll são executadas no Mac e Linux também com o .NET Core.
Jim Aho

Respostas:

287

O que é uma DLL?

As bibliotecas de vínculo dinâmico (DLL) são como EXEs, mas não são diretamente executáveis. Eles são semelhantes aos arquivos .so no Linux / Unix. Ou seja, DLLs são a implementação da Microsoft de bibliotecas compartilhadas.

As DLLs são tão parecidas com um EXE que o próprio formato de arquivo é o mesmo. EXE e DLLs são baseados no formato de arquivo executável portátil (PE). As DLLs também podem conter componentes COM e bibliotecas .NET.

O que contém uma DLL?

Uma DLL contém funções, classes, variáveis, interfaces de usuário e recursos (como ícones, imagens, arquivos, ...) que um EXE ou outra DLL usa.

Tipos de bibliotecas:

Em praticamente todos os sistemas operacionais, existem 2 tipos de bibliotecas. Bibliotecas estáticas e dinâmicas. No Windows, as extensões de arquivo são as seguintes: Bibliotecas estáticas (.lib) e bibliotecas dinâmicas (.dll). A principal diferença é que as bibliotecas estáticas estão vinculadas ao executável no momento da compilação; enquanto as bibliotecas vinculadas dinâmicas não são vinculadas até o tempo de execução.

Mais sobre bibliotecas estáticas e dinâmicas:

Normalmente, você não vê bibliotecas estáticas no seu computador, porque uma biblioteca estática é incorporada diretamente dentro de um módulo (EXE ou DLL). Uma biblioteca dinâmica é um arquivo independente.

Uma DLL pode ser alterada a qualquer momento e só é carregada em tempo de execução quando um EXE carrega explicitamente a DLL. Uma biblioteca estática não pode ser alterada depois de compilada no EXE. Uma DLL pode ser atualizada individualmente sem atualizar o próprio EXE.

Carregando uma DLL:

Um programa carrega uma DLL na inicialização, por meio da LoadLibrary da API do Win32 ou quando é uma dependência de outra DLL. Um programa usa o GetProcAddress para carregar uma função ou LoadResource para carregar um recurso.

Leitura adicional:

Por favor, verifique o MSDN ou a Wikipedia para ler mais. Também as fontes desta resposta.

Brian R. Bondy
fonte
5
Provavelmente deve mencionar a lib de importação em algum lugar. OK, eu vou embora agora. :)
Adam Mitz 24/09/08
2
Removidos aqueles que parecem ser abordados. Como obtenho pontos por isso? <g>
Adam Mitz 24/09/08
36

O que é uma DLL?

Os arquivos DLL são arquivos binários que podem conter código executável e recursos como imagens, etc. Ao contrário dos aplicativos, eles não podem ser executados diretamente, mas um aplicativo os carregará como e quando forem necessários (ou todos de uma vez durante a inicialização).

Eles são importantes?

A maioria dos aplicativos carrega os arquivos DLL necessários na inicialização. Se algum desses itens não for encontrado, o sistema não poderá iniciar o processo.

Arquivos DLL podem exigir outros arquivos DLL

Da mesma maneira que um aplicativo requer um arquivo DLL, um arquivo DLL pode depender de outros arquivos DLL. Se um desses arquivos DLL na cadeia de dependência não for encontrado, o aplicativo não será carregado. Isso é depurado facilmente usando qualquer ferramenta de walker de dependência, como o Dependency Walker .

Existem muitos deles nas pastas do sistema

A maior parte da funcionalidade do sistema é exposta a um programa de usuário na forma de arquivos DLL, pois eles são uma forma padrão de compartilhamento de código / recursos. Cada funcionalidade é mantida separadamente em diferentes arquivos DLL, para que apenas os arquivos DLL necessários sejam carregados e, assim, reduzam as restrições de memória no sistema.

Aplicativos instalados também usam arquivos DLL

Os arquivos DLL também se tornam uma forma de separar funcionalidades fisicamente, conforme explicado acima. Bons aplicativos também tentam não carregar os arquivos DLL até que sejam absolutamente necessários, o que reduz os requisitos de memória. Isso também faz com que os aplicativos sejam enviados com muitos arquivos DLL.

DLL Hell

No entanto, às vezes as atualizações do sistema geralmente interrompem outros programas quando há uma incompatibilidade de versão entre os arquivos DLL compartilhados e o programa que os exige. Pontos de verificação do sistema e cache de DLL etc. foram as iniciativas da M $ para resolver esse problema. A plataforma .NET pode não enfrentar esse problema.

Como sabemos o que há dentro de um arquivo DLL?

Você precisa usar uma ferramenta externa como DUMPBIN ou Dependency Walker, que não apenas mostrará quais funções publicamente visíveis (conhecidas como exportações) estão contidas nos arquivos DLL e também quais outros arquivos DLL são necessários e que exporta desses arquivos DLL para este arquivo DLL é dependente.

Como os criamos / usamos?

Consulte a documentação de programação do seu fornecedor. Para C ++, consulte LoadLibrary no MSDN.

vida de computação
fonte
2
Por favor, complete esta frase ( "The .NET platform might not face this issue at all.") com um porquê. Obrigado.
Jogi
1
@RehanKhan A partir do .NET Framework v2.0, o tempo de execução só carrega montagens compiladas com uma versão .NET <= tempo de execução atualmente carregado + .NET também armazena em cache tentativas com falha de carregamento de montagens + se uma chamada anterior já localizou uma montagem, o tempo de execução CL usará a montagem já carregada. Em suma, eu acho que é melhor dizer que eles resolveram o problema aplicando restrições muito pesadas sobre quais DLLs o tempo de execução de um programa carregará (antes que ele desista e peça sua ajuda).
Vladislav Martin
14

Digamos que você esteja criando um executável que usa algumas funções encontradas em uma biblioteca.

Se a biblioteca que você está usando for estática , o vinculador copiará o código do objeto para essas funções diretamente da biblioteca e as inserirá no executável.

Agora, se esse executável é executado, ele tem tudo o que precisa, portanto o carregador executável apenas o carrega na memória e o executa.

Se a biblioteca for dinâmica, o vinculador não inserirá o código do objeto, mas sim um stub que basicamente diz que esta função está localizada nesta DLL neste local.

Agora, se esse executável for executado, faltam bits do executável (ou seja, os stubs), portanto o carregador passa pelo executável corrigindo os stubs ausentes. Somente após a resolução de todos os stubs, o executável poderá ser executado.

Para ver isso em ação, exclua ou renomeie a DLL e observe como o carregador relatará um erro de DLL ausente ao tentar executar o executável.

Portanto, o nome Dynamic Link Library , partes do processo de vinculação estão sendo feitas dinamicamente em tempo de execução pelo carregador executável.

Uma observação final, se você não vincular à DLL, nenhum stubs será inserido pelo vinculador, mas o Windows ainda fornecerá a API GetProcAddress que permite carregar e executar o ponto de entrada da função DLL muito tempo após o início do executável.

jussij
fonte
12

DLLs (bibliotecas de vínculo dinâmico) e SLs (bibliotecas compartilhadas, equivalentes no UNIX) são apenas bibliotecas de código executável que podem ser dinamicamente vinculadas a um executável no momento do carregamento.

Bibliotecas estáticas são inseridas em um executável em tempo de compilação e são corrigidas a partir desse ponto. Eles aumentam o tamanho do executável e não podem ser compartilhados.

Bibliotecas dinâmicas têm as seguintes vantagens:

1 / Eles são carregados no tempo de execução, em vez do tempo de compilação, para que possam ser atualizados independentemente do executável (todas as janelas e caixas de diálogo sofisticadas que você vê no Windows são provenientes de DLLs, portanto a aparência do seu aplicativo pode mudar sem você reescrevê-lo).

2 / Por serem independentes, o código pode ser compartilhado entre vários executáveis ​​- isso economiza memória, pois, se você estiver executando 100 aplicativos com uma única DLL, pode haver apenas uma cópia da DLL na memória.

A principal desvantagem é a vantagem nº 1 - com a alteração independente das DLLs, o aplicativo pode fazer com que o aplicativo pare de funcionar ou comece a se comportar de maneira bizarra. O controle de versão da DLL costuma não ser muito bem gerenciado no Windows, o que leva ao nome de "DLL Hell", com um nome singular.

paxdiablo
fonte
11

Os arquivos DLL contêm uma tabela de exportação, que é uma lista de símbolos que podem ser consultados pelo programa de chamada. Os símbolos são normalmente funções com a convenção de chamada C ( __stcall ). A tabela de exportação também contém o endereço da função.

Com essas informações, o programa de chamada pode chamar as funções na DLL, mesmo que não tenha acesso à DLL no momento da compilação.

A introdução de bibliotecas de vínculo dinâmico tem mais algumas informações.

Adam Pierce
fonte
6

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

Uma DLL é uma biblioteca que contém código e dados que podem ser usados ​​por mais de um programa ao mesmo tempo. Por exemplo, nos sistemas operacionais Windows, a DLL Comdlg32 executa funções relacionadas à caixa de diálogo comum. Portanto, cada programa pode usar a funcionalidade contida nesta DLL para implementar uma caixa de diálogo Abrir. Isso ajuda a promover a reutilização de código e o uso eficiente da memória.

Usando uma DLL, um programa pode ser modularizado em componentes separados. Por exemplo, um programa de contabilidade pode ser vendido por módulo. Cada módulo pode ser carregado no programa principal em tempo de execução, se esse módulo estiver instalado. Como os módulos são separados, o tempo de carregamento do programa é mais rápido e um módulo é carregado apenas quando essa funcionalidade é solicitada.

Além disso, as atualizações são mais fáceis de serem aplicadas a cada módulo sem afetar outras partes do programa. Por exemplo, você pode ter um programa de folha de pagamento e as taxas de imposto são alteradas a cada ano. Quando essas alterações são isoladas em uma DLL, você pode aplicar uma atualização sem precisar criar ou instalar o programa inteiro novamente.

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

Jorge Ferreira
fonte
2

DLL é um formato de arquivo "Extensão de arquivo e conhecido como" biblioteca de vínculo dinâmico "" usado para armazenar vários códigos e procedimentos para programas do Windows. O Software & Games é executado com base nos arquivos DLL; Os arquivos DLL foram criados para que vários aplicativos pudessem usar suas informações ao mesmo tempo.

Se você quiser obter mais informações sobre arquivos DLL ou enfrentar algum erro, leia a seguinte postagem. https://www.bouncegeek.com/fix-dll-errors-windows-586985/

Akshya Nagar
fonte
1

As DLLs (bibliotecas de vínculo dinâmico) contêm recursos usados ​​por um ou mais aplicativos ou serviços. Eles podem conter classes, ícones, strings, objetos, interfaces e praticamente qualquer coisa que um desenvolvedor precise armazenar, exceto uma interface do usuário.

tsilb
fonte
3
Eles podem realmente armazenar uma interface do usuário e vários programas fazem isso. Por exemplo, snap-ins.
Brian R. Bondy
1

De acordo com a Microsoft

Bibliotecas de vínculo dinâmico (DLL) são arquivos que contêm dados, código ou recursos necessários para a execução de aplicativos. Esses são arquivos criados pelo ecossistema do Windows e podem ser compartilhados entre dois ou mais aplicativos.

Quando um programa ou software é executado no Windows, muito do funcionamento do aplicativo depende dos arquivos DLL do programa. Por exemplo, se um aplicativo específico tiver vários módulos, a maneira como cada módulo interage é determinada pelos arquivos DLL do Windows.

Se você quiser uma explicação detalhada, verifique estes recursos úteis

O que são arquivos DLL , Sobre os arquivos DLL

construtores de código
fonte