Czym dokładnie są pliki DLL i jak działają?


224

Jak dokładnie działają pliki DLL? Wygląda na to, że jest ich okropnie dużo, ale nie wiem, czym są i jak działają.

Więc o co z nimi chodzi?


6
Ponieważ jest to oznaczone tylko Windows, a to pytanie zostało napisane w 2008 roku, warto wspomnieć, że obecnie dll działa również na Macu i Linuksie z .NET Core.
Jim Aho,

Odpowiedzi:


287

Co to jest biblioteka DLL?

Biblioteki DLL (Dynamic Link Libraries) są jak EXE, ale nie są bezpośrednio wykonywalne. Są podobne do plików .so w systemie Linux / Unix. Innymi słowy, biblioteki DLL są implementacją bibliotek współdzielonych przez MS.

Pliki DLL są tak podobne do pliku EXE, że sam format pliku jest taki sam. Zarówno EXE, jak i DLL są oparte na formacie pliku Portable Executable (PE). Biblioteki DLL mogą również zawierać składniki COM i biblioteki .NET.

Co zawiera biblioteka DLL?

Biblioteka DLL zawiera funkcje, klasy, zmienne, interfejsy użytkownika i zasoby (takie jak ikony, obrazy, pliki itp.), Których używa EXE lub inna biblioteka DLL.

Rodzaje bibliotek:

W praktycznie wszystkich systemach operacyjnych istnieją 2 typy bibliotek. Biblioteki statyczne i biblioteki dynamiczne. W systemie Windows rozszerzenia plików są następujące: biblioteki statyczne (.lib) i biblioteki dynamiczne (.dll). Główną różnicą jest to, że biblioteki statyczne są połączone z plikiem wykonywalnym w czasie kompilacji; podczas gdy dynamicznie połączone biblioteki nie są łączone do czasu wykonania.

Więcej na temat bibliotek statycznych i dynamicznych:

Zwykle nie widzisz bibliotek statycznych na komputerze, ponieważ biblioteka statyczna jest osadzona bezpośrednio w module (EXE lub DLL). Biblioteka dynamiczna jest plikiem autonomicznym.

Bibliotekę DLL można zmienić w dowolnym momencie i jest ładowana tylko w czasie wykonywania, gdy plik DLL jawnie ładuje bibliotekę DLL. Biblioteki statycznej nie można zmienić po skompilowaniu jej w pliku EXE. Bibliotekę DLL można aktualizować indywidualnie bez aktualizacji samego pliku EXE.

Ładowanie biblioteki DLL:

Program ładuje bibliotekę DLL podczas uruchamiania, za pośrednictwem biblioteki DLL API Win32 lub gdy jest to zależność od innej biblioteki DLL. Program używa GetProcAddress w celu załadowania funkcji lub LoadResource w celu załadowania zasobu.

Dalsza lektura:

Proszę sprawdzić MSDN lub Wikipedię do dalszego czytania. Również źródła tej odpowiedzi.


5
Prawdopodobnie powinien gdzieś wspomnieć o importowanej bibliotece lib. OK, odejdę teraz. :)
Adam Mitz

2
Usunięto te, które wydają się być adresowane. Jak zdobyć za to punkty? <g>
Adam Mitz,

36

Co to jest biblioteka DLL?

Pliki DLL to pliki binarne, które mogą zawierać kod wykonywalny i zasoby, takie jak obrazy itp. W przeciwieństwie do aplikacji, nie można ich bezpośrednio wykonać, ale aplikacja załaduje je w dowolnym momencie (lub wszystkich jednocześnie podczas uruchamiania).

Czy są ważne?

Większość aplikacji ładuje potrzebne pliki DLL podczas uruchamiania. Jeśli któreś z nich nie zostanie znalezione, system w ogóle nie będzie mógł rozpocząć procesu.

Pliki DLL mogą wymagać innych plików DLL

W taki sam sposób, w jaki aplikacja wymaga pliku DLL, plik DLL może zależeć od innych plików DLL. Jeśli jeden z tych plików DLL w łańcuchu zależności nie zostanie znaleziony, aplikacja się nie załaduje. Można to łatwo debugować za pomocą dowolnych narzędzi Walkera zależności , takich jak Dependency Walker .

Jest ich tak wiele w folderach systemowych

Większość funkcji systemu jest udostępniana programowi użytkownika w postaci plików DLL, ponieważ są one standardową formą udostępniania kodu / zasobów. Każda funkcjonalność jest przechowywana osobno w różnych plikach DLL, dzięki czemu zostaną załadowane tylko wymagane pliki DLL, co zmniejszy ograniczenia pamięci w systemie.

Zainstalowane aplikacje również używają plików DLL

Pliki DLL stają się również formą fizycznego oddzielania funkcjonalności, jak wyjaśniono powyżej. Dobre aplikacje również próbują nie ładować plików DLL, dopóki nie będą absolutnie wymagane, co zmniejsza wymagania dotyczące pamięci. To również powoduje, że aplikacje są dostarczane z dużą ilością plików DLL.

DLL Hell

Jednak czasami aktualizacje systemu często psują inne programy, gdy występuje niezgodność wersji między udostępnionymi plikami DLL a programem, który ich wymaga. Systemowe punkty kontrolne i pamięć podręczna DLL itp. To inicjatywy M $ mające na celu rozwiązanie tego problemu. Platforma .NET może wcale nie napotkać ten problem.

Skąd wiemy, co znajduje się w pliku DLL?

Musisz użyć zewnętrznego narzędzia, takiego jak DUMPBIN lub Dependency Walker, które pokaże nie tylko jakie publicznie widoczne funkcje (znane jako eksport) są zawarte w plikach DLL, a także jakie inne wymagane pliki DLL i które eksportuje z tych plików DLL ten plik DLL zależy od.

Jak je tworzymy / wykorzystujemy?

Zapoznaj się z dokumentacją programową od swojego dostawcy. W przypadku C ++ zapoznaj się z LoadLibrary w MSDN.


2
Uzupełnij to zdanie ( "The .NET platform might not face this issue at all."), podając dlaczego. Dzięki.
Jogi,

1
@RehanKhan Począwszy od .NET Framework v2.0, środowisko wykonawcze będzie ładować tylko zestawy skompilowane z wersją .NET <= aktualnie załadowane środowisko uruchomieniowe + .NET także buforuje nieudane próby załadowania zespołów + jeśli poprzednie wywołanie już zlokalizowało zestaw, środowisko wykonawcze CL użyje już załadowanego zestawu. Podsumowując, myślę, że lepiej powiedzieć, że rozwiązali problem, nakładając bardzo duże ograniczenia na biblioteki DLL, które ładuje środowisko wykonawcze programu (zanim po prostu zrezygnuje i poprosi o pomoc).
Vladislav Martin

14

Załóżmy, że tworzysz plik wykonywalny, który korzysta z niektórych funkcji znalezionych w bibliotece.

Jeśli używana biblioteka jest statyczna , linker skopiuje kod obiektu dla tych funkcji bezpośrednio z biblioteki i wstawi je do pliku wykonywalnego.

Teraz, jeśli ten plik wykonywalny jest uruchomiony, ma wszystko, czego potrzebuje, więc moduł ładujący po prostu ładuje go do pamięci i uruchamia.

Jeśli biblioteka jest dynamiczna, linker nie wstawi kodu obiektowego, ale wstawi kod pośredniczący, który w zasadzie mówi, że ta funkcja znajduje się w tej bibliotece DLL w tym miejscu.

Teraz, jeśli ten plik wykonywalny jest uruchomiony, brakuje fragmentów pliku wykonywalnego (tj. Kodów pośredniczących), więc moduł ładujący przechodzi przez plik wykonywalny, naprawiając brakujące kody pośredniczące. Plik wykonywalny będzie można uruchomić dopiero po rozstrzygnięciu wszystkich kodów pośredniczących.

Aby zobaczyć, jak to działa, usuń lub zmień nazwę biblioteki DLL i zobacz, jak moduł ładujący zgłosi brakujący błąd DLL podczas próby uruchomienia pliku wykonywalnego.

Stąd nazwa Dynamic Link Library , część procesu łączenia jest wykonywana dynamicznie w czasie wykonywania przez program ładujący.

Jeszcze jedna uwaga, jeśli nie podłączysz do DLL, to linker nie wstawi żadnych kodów pośredniczących, ale system Windows nadal udostępnia interfejs API GetProcAddress, który pozwala załadować punkt wejścia funkcji DLL na długo po uruchomieniu pliku wykonywalnego.


12

Biblioteki DLL (biblioteki linków dynamicznych) i biblioteki SL (biblioteki współdzielone, równoważne w systemie UNIX) to tylko biblioteki kodu wykonywalnego, które można dynamicznie połączyć w plik wykonywalny podczas ładowania.

Biblioteki statyczne są wstawiane do pliku wykonywalnego w czasie kompilacji i są ustalane od tego momentu. Zwiększają rozmiar pliku wykonywalnego i nie mogą być współużytkowane.

Biblioteki dynamiczne mają następujące zalety:

1 / Są ładowane w czasie wykonywania, a nie w czasie kompilacji, dzięki czemu można je aktualizować niezależnie od pliku wykonywalnego (wszystkie te fantazyjne okna i okna dialogowe widoczne w systemie Windows pochodzą z bibliotek DLL, więc wygląd aplikacji może się zmienić bez ciebie konieczność przepisania).

2 / Ponieważ są one niezależne, kod może być współużytkowany przez wiele plików wykonywalnych - oszczędza to pamięć, ponieważ jeśli używasz 100 aplikacji z jedną biblioteką DLL, w pamięci może znajdować się tylko jedna kopia biblioteki DLL.

Ich główną wadą jest zaleta nr 1 - niezależne zmienianie bibliotek DLL przez aplikację może spowodować, że aplikacja przestanie działać lub zacznie się dziwnie zachowywać. Wersjonowanie bibliotek DLL zwykle nie jest dobrze zarządzane w systemie Windows, co prowadzi do osobliwej nazwy „DLL Hell”.


11

Pliki DLL zawierają tabelę eksportu, która jest listą symboli, które mogą być wyszukiwane przez program wywołujący. Symbole zwykle działają zgodnie z konwencją wywoływania C ( __stcall ). Tabela eksportu zawiera również adres funkcji.

Dzięki tym informacjom program wywołujący może następnie wywoływać funkcje w bibliotece DLL, nawet jeśli nie miał dostępu do biblioteki DLL w czasie kompilacji.

Wprowadzenie do bibliotek dynamicznych łączy zawiera więcej informacji.


6

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

DLL to biblioteka zawierająca kod i dane, z których może korzystać jednocześnie więcej niż jeden program. Na przykład w systemach operacyjnych Windows biblioteka DLL Comdlg32 wykonuje typowe funkcje związane z oknami dialogowymi. Dlatego każdy program może korzystać z funkcji zawartych w tej bibliotece DLL, aby zaimplementować okno dialogowe Otwórz. Pomaga to promować ponowne użycie kodu i efektywne wykorzystanie pamięci.

Korzystając z biblioteki DLL, program można zmodularyzować w osobne komponenty. Na przykład program księgowy może być sprzedawany według modułu. Każdy moduł można załadować do programu głównego w czasie wykonywania, jeśli moduł ten jest zainstalowany. Ponieważ moduły są oddzielne, czas ładowania programu jest krótszy, a moduł jest ładowany tylko wtedy, gdy żądana jest ta funkcjonalność.

Ponadto aktualizacje są łatwiejsze do zastosowania dla każdego modułu bez wpływu na inne części programu. Na przykład możesz mieć program płac, a stawki podatkowe zmieniają się co roku. Gdy te zmiany zostaną wyizolowane z biblioteki DLL, możesz zastosować aktualizację bez konieczności ponownego budowania lub instalowania całego programu.

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


2

DLL to rozszerzenie pliku znane jako „biblioteka linków dynamicznych” do przechowywania wielu kodów i procedur dla programów Windows. Oprogramowanie i gry działają na podstawie plików DLL; Pliki DLL zostały utworzone, aby wiele aplikacji mogło jednocześnie korzystać z ich informacji.

JEŚLI chcesz uzyskać więcej informacji o plikach DLL lub napotkasz błąd, przeczytaj następujący post. https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1

Biblioteki DLL (Dynamic Link Libraries) zawierają zasoby używane przez jedną lub więcej aplikacji lub usług. Mogą zawierać klasy, ikony, ciągi znaków, obiekty, interfejsy i prawie wszystko, co programista musiałby przechowywać oprócz interfejsu użytkownika.


3
Mogą faktycznie przechowywać interfejs użytkownika i robi to kilka programów. Na przykład przystawki.
Brian R. Bondy,

1

Według Microsoft

(DLL) Biblioteki linków dynamicznych to pliki zawierające dane, kod lub zasoby potrzebne do działania aplikacji. Są to pliki tworzone przez ekosystem Windows i mogą być współużytkowane przez dwie lub więcej aplikacji.

Gdy program lub oprogramowanie działa w systemie Windows, duża część działania aplikacji zależy od plików DLL programu. Na przykład, jeśli konkretna aplikacja miała kilka modułów, to sposób, w jaki każdy moduł współdziała ze sobą, jest określony przez pliki DLL systemu Windows.

Jeśli potrzebujesz szczegółowych wyjaśnień, sprawdź te przydatne zasoby

Co to są pliki dll , informacje o plikach dll

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.