Różnica między plikami .dll i .exe?

92

Chcę poznać dokładną różnicę między plikiem dll i exe.

Umesh Aawte
źródło
1
Powinieneś dodać tutaj trochę kontekstu: Czy jesteś początkującym Czy szukasz jakiejś głębokiej specyfikacji technicznej rzeczy PE, czy czegoś innego
khebbie
3
To prawda, że ​​jestem początkującym. Jest to pytanie do wywiadu oznaczone tagiem.
Umesh Aawte
Co ważniejsze, jest to duplikat, w tym jeden (usunięty) przez sakthivignesh ...
Marc Gravell

Odpowiedzi:

73

EXE:

  1. To plik wykonywalny
  2. Podczas ładowania pliku wykonywalnego nie jest wywoływany żaden eksport, a jedynie punkt wejścia modułu.
  3. Kiedy system uruchamia nowy plik wykonywalny, tworzony jest nowy proces
  4. Wątek wejściowy jest wywoływany w kontekście głównego wątku tego procesu.

DLL:

  1. To jest biblioteka linków dynamicznych
  2. Istnieje wiele wyeksportowanych symboli.
  3. System ładuje bibliotekę DLL w kontekście istniejącego procesu.

Więcej szczegółów: 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

Źródła: http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx

Firstthumb
źródło
9
System ładuje bibliotekę DLL do istniejącego PROCESU, a nie wątku. Każda biblioteka DLL w procesie może otrzymać powiadomienie o uruchomieniu lub zatrzymaniu wątku za pośrednictwem LibMainfunkcji.
Daniel Earwicker,
13
Twoje punkty 1 i 2 nie są w 100% poprawne. Ponieważ możesz użyć LoadLibraryEx na exe lub dll, oznacza to, że możesz użyć GetProcAddress do załadowania punktu wejścia z exe lub dll. W związku z tym zarówno pliki exe, jak i dll mogą być dynamicznie łączone i mogą mieć dowolną liczbę punktów wejścia.
jussij
135

Nie wiem, dlaczego wszyscy odpowiadają na to pytanie w kontekście .NET. Pytanie było ogólne i nigdzie nie wspominano o .NET.

Cóż, główne różnice to:

EXE

  1. Plik exe zawsze działa w swojej własnej przestrzeni adresowej, tj. Jest to oddzielny proces.
  2. Celem EXE jest uruchomienie oddzielnej aplikacji.

DLL

  1. Biblioteka dll zawsze wymaga do uruchomienia hosta exe. tj. nigdy nie może działać we własnej przestrzeni adresowej.
  2. Celem biblioteki DLL jest posiadanie kolekcji metod / klas, które mogą być ponownie użyte z innej aplikacji.
  3. DLL to implementacja biblioteki współdzielonej firmy Microsoft.

Format plików DLL i exe jest zasadniczo taki sam. System Windows rozpoznaje różnicę między plikami DLL i EXE poprzez nagłówek PE w pliku. Aby uzyskać szczegółowe informacje na temat nagłówka PE, możesz zapoznać się z tym artykułem w witrynie MSDN

Aamir
źródło
4
Więc jeśli chcesz, abyś mógł zmienić nazwę i edytować nagłówek pliku, aby zamienić bibliotekę dll w plik exe i odwrotnie?
RCIX,
@RCIX: Wątpię, czy jest to możliwe?
VoodooChild
Najprawdopodobniej nie jest to możliwe - zobacz odpowiedź Kichika poniżej.
Jonathon Reinhart
32

Różnica polega na tym, że plik EXE ma punkt wejścia, „główną” metodę, która będzie uruchamiana podczas wykonywania.

Kod w bibliotece DLL musi zostać wywołany z innej aplikacji.

Robin Day
źródło
12
Jest to nieprawidłowe ładowanie, co oznacza, że ​​biblioteki DLL nie mają punktów wejścia. Biblioteki DLL mogą mieć punkt wejścia DLLMain, który jest wywoływany, gdy (między innymi) biblioteka DLL jest ładowana do procesu
jay.lee
29

Istnieje kilka innych różnic dotyczących struktury, o których możesz wspomnieć.

  1. Zarówno DLL, jak i EXE mają tę samą strukturę plików - Portable Executable lub PE. Aby rozróżnić pomiędzy nimi, można spojrzeć na Characteristicsczłonka IMAGE_FILE_HEADERwewnątrz IMAGE_NT_HEADERS. W przypadku biblioteki DLL ma IMAGE_FILE_DLLwłączoną flagę (0x2000). W przypadku EXE jest to IMAGE_FILE_EXECUTABLE_IMAGEflaga (0x2).
  2. Pliki PE składają się z niektórych nagłówków i wielu sekcji. Zwykle jest sekcja na kod, sekcja na dane, sekcja zawierająca zaimportowane funkcje i sekcja dotycząca zasobów. Niektóre sekcje mogą zawierać więcej niż jedną rzecz. Nagłówek opisuje również listę katalogów danych, które znajdują się w sekcjach. Te katalogi danych umożliwiają systemowi Windows znalezienie tego, czego potrzebuje w środowisku PE. Ale jednym typem katalogu danych, którego EXE nigdy nie będzie (chyba że tworzysz EXE Frankensteina), jest katalog eksportu. W tym miejscu pliki DLL mają listę funkcji, które eksportują i mogą być używane przez inne pliki EXE lub DLL. Z drugiej strony, każda biblioteka DLL i EXE ma katalog importu, w którym zawiera listę funkcji i plików DLL wymaganych do uruchomienia.
  3. Również w nagłówkach PE ( IMAGE_OPTIONAL_HEADER) znajduje się ImageBaseczłonek. Określa adres wirtualny, pod którym PE zakłada, że ​​zostanie załadowany. Jeśli jest ładowany pod innym adresem, niektóre wskaźniki mogą wskazywać na niewłaściwą pamięć. Ponieważ pliki EXE są jednymi z pierwszych ładowanych do nowej przestrzeni adresowej, moduł ładujący systemu Windows może zapewnić stały adres ładowania, zwykle 0x00400000. Ten luksus nie istnieje dla biblioteki DLL. Dwa pliki DLL załadowane do tego samego procesu mogą żądać tego samego adresu. Z tego powodu biblioteka DLL ma inny katalog danych o nazwie Podstawowy katalog relokacji, który zwykle znajduje się w swojej własnej sekcji - .reloc. Ten katalog zawiera listę miejsc w bibliotece DLL, które należy ponownie bazować / załatać, aby wskazywały odpowiednią pamięć. Większość plików EXE nie ma tego katalogu, ale niektóre stare kompilatory je generują.

Możesz przeczytać więcej na ten temat @ MSDN .

kichik
źródło
2
1. Ponieważ są to flagi, obie można ustawić jednocześnie. 2. Jak powiedziałeś, jest to możliwe, ale znikome mało prawdopodobne. 3. ASLR przeniesie również exe, jeśli to możliwe. Więc tak, nawet exe może mieć relokacje. Ogólnie rzecz biorąc, pliki EXE, które są plikami DLL, są możliwe, ale rzadko .
Deduplicator
22

Ta odpowiedź była trochę bardziej szczegółowa, niż myślałem, ale ją przeczytałem.

DLL:
W większości przypadków plik DLL jest biblioteką . Istnieje kilka typów bibliotek, dynamiczne i statyczne - przeczytaj o różnicy . DLL oznacza dołączanej dynamicznie biblioteki , która mówi nam, że jest to część programu, ale nie całość. Składa się z komponentów oprogramowania wielokrotnego użytku ( biblioteki ), których można używać w więcej niż jednym programie . Należy pamiętać, że zawsze jest możliwe użycie kodu źródłowego biblioteki w wielu aplikacjach za pomocą kopiowania i wklejania, ale idea DLL / biblioteki statycznej polega na tym, że można aktualizować kod biblioteki i jednocześnie aktualizować wszystkie aplikacje za pomocą it - bez kompilacji.

Na przykład:
Wyobraź sobie, że tworzysz składnik GUI systemu Windows, taki jak przycisk . W większości przypadków chciałbyś ponownie wykorzystać napisany kod, ponieważ jest to złożony, ale powszechny składnik - chcesz, aby wiele aplikacji z niego korzystało, ale nie chcesz podawać im kodu źródłowego Nie możesz skopiować -wklej kod przycisku w każdym programie, aby zdecydować, że chcesz utworzyć bibliotekę DL (DLL) .

Ta biblioteka "przycisków" jest wymagana do uruchomienia przez pliki Cutables EXE , a bez niej nie będą działać, ponieważ nie wiedzą, jak utworzyć przycisk, a jedynie jak z nim rozmawiać.

Podobnie nie można uruchomić biblioteki DLL - uruchomić, ponieważ jest ona tylko częścią programu, ale nie zawiera informacji wymaganych do utworzenia „procesu” .

EXE:
Plik wykonywalny to program . Wie, jak utworzyć proces i jak rozmawiać z biblioteką DLL. To wymaga DLL, aby utworzyć przycisk, a bez niej aplikacja nie działa - błąd.

mam nadzieję że to pomoże....

Hannson
źródło
W świecie programowania .NET, kiedy importujesz rzeczy z innych modułów, na przykład w C # using SomeClassFromALibrary, ta biblioteka jest połączona z projektem za pośrednictwem biblioteki DLL? Po prostu próbuję sprawdzić, czy dobrze rozumiem
Abdul
Zwykle używasz słowa kluczowego usingdla przestrzeni nazw, a nie klas. Wyjątek jest using staticdostępny z języka C # 6, który importuje wszystkie statyczne elementy członkowskie obecne w określonej klasie ( link ). Słowo usingkluczowe daje kompilatorowi obietnicę, że w czasie wykonywania będzie biblioteka zawierająca tę przestrzeń nazw . Biblioteka nie jest połączona z projektem za pośrednictwem tej biblioteki DLL, biblioteka DLL jest biblioteką połączoną z projektem (zespołem). Ta biblioteka DLL zawiera cały kod, który był obiecany w czasie kompilacji.
Darius
17

Zarówno DLL, jak i EXE są formatami przenośnych plików wykonywalnych (PE)

Biblioteki dołączanej dynamicznie (DLL) jest biblioteką, a zatem nie mogą być wykonywane bezpośrednio. Jeśli spróbujesz go uruchomić, pojawi się błąd dotyczący brakującego punktu wejścia. Do wykonania potrzebny jest punkt wejścia (główna funkcja), tym punktem wejścia może być dowolna aplikacja lub plik exe. Powiązanie biblioteki DLL występuje w czasie wykonywania. Dlatego nazywa się biblioteką „Dynamic Link”.

Plik wykonywalny (EXE) to program, który można uruchomić. Ma własny punkt wejścia. Flaga wewnątrz nagłówka PE wskazuje, jakiego typu jest to plik (bez znaczenia dla rozszerzenia pliku). Nagłówek PE ma pole, w którym znajduje się punkt wejścia programu. W bibliotekach DLL nie jest używany (a przynajmniej nie jako punkt wejścia).

Dostępnych jest wiele programów do sprawdzania informacji nagłówka. Jedyną różnicą powodującą, że oba działają inaczej, jest bit w nagłówku, jak pokazano na poniższym schemacie.

nagłówek

Plik EXE ma tylko jeden główny wpis, co oznacza, że ​​jest to izolowana aplikacja, gdy system uruchamia exe, tworzony jest nowy proces, podczas gdy biblioteki DLL mają wiele punktów wejścia, więc gdy aplikacja go używa, żaden nowy proces nie jest uruchamiany, DLL może być ponownie użyty i wersjonowany. Biblioteka DLL zmniejsza przestrzeń dyskową, ponieważ różne programy mogą używać tej samej biblioteki DLL.

Zaheer Ahmed
źródło
3
Mówisz „Flaga wewnątrz nagłówka PE wskazuje, jakiego typu jest to plik (bez znaczenia rozszerzenia pliku)” - Czy to oznacza, czy rozszerzenie ma znaczenie, .execzy .dllnie? To ta flaga w nagłówku naprawdę je wyróżnia… Więc jeśli utworzę go exei nadam mu nazwę a .dll, a potem zmienię tę flagę ręcznie, nadal będzie działać?
Abdul
6

Dll v / s Exe

1) Plik DLL to biblioteka dołączana dynamicznie, której można używać w plikach exe i innych plikach dll.
Plik EXE to plik wykonywalny, który działa w oddzielnym procesie zarządzanym przez system operacyjny.

2) Biblioteki DLL nie są bezpośrednio wykonywalne. Są to oddzielne pliki zawierające funkcje, które mogą być wywoływane przez programy i inne biblioteki DLL w celu wykonywania obliczeń i funkcji.
EXE to program, który można uruchomić. Np .: program Windows

3) Biblioteka
DLL wielokrotnego użytku : mogą być ponownie użyte w innej aplikacji. Tak długo, jak koder zna nazwy i parametry funkcji i procedur w pliku DLL.
EXE: tylko w określonym celu.

4) Biblioteka DLL współużytkuje ten sam proces i przestrzeń pamięci aplikacji wywołującej, podczas gdy plik
EXE tworzy oddzielny proces i przestrzeń pamięci.

5) Używa
DLL: Chcesz, aby wiele aplikacji z niego korzystało, ale nie chcesz podawać im kodu źródłowego Nie możesz skopiować i wkleić kodu przycisku w każdym programie, więc decydujesz, że chcesz utworzyć DL- Biblioteka (DLL).

EXE: Kiedy pracujemy z szablonami projektów, takimi jak aplikacje Windows Forms, aplikacje konsolowe, aplikacje WPF i usługi Windows, podczas kompilacji generują zestaw exe.

6) Podobieństwa:
Zarówno DLL, jak i EXE są plikami binarnymi, mają złożoną, zagnieżdżoną strukturę zdefiniowaną przez format Portable Executable i nie są przeznaczone do edycji przez użytkowników.

skanda93
źródło
4

Dwie rzeczy: rozszerzenie i flaga nagłówka przechowywane w pliku.

Oba pliki są plikami PE. Obie zawierają dokładnie ten sam układ. Biblioteka DLL jest biblioteką i dlatego nie można jej wykonać. Jeśli spróbujesz go uruchomić, pojawi się błąd dotyczący brakującego punktu wejścia. EXE to program, który można uruchomić. Ma punkt wejścia. Flaga wewnątrz nagłówka PE wskazuje, jaki to jest typ pliku (bez znaczenia dla rozszerzenia pliku). Nagłówek PE ma pole, w którym znajduje się punkt wejścia programu. W bibliotekach DLL nie jest używany (a przynajmniej nie jako punkt wejścia).

Niewielka różnica polega na tym, że w większości przypadków biblioteki DLL mają sekcję eksportu, w której eksportowane są symbole. Pliki EXE nigdy nie powinny mieć sekcji eksportu, ponieważ nie są bibliotekami, ale nic nie stoi na przeszkodzie, aby tak się stało. Program ładujący Win32 nie dba o to.

Poza tym są identyczne. Podsumowując, pliki EXE są programami wykonywalnymi, podczas gdy biblioteki DLL są bibliotekami ładowanymi do procesu i zawierają przydatne funkcje, takie jak bezpieczeństwo, dostęp do bazy danych lub coś takiego.

Judy Smith
źródło
3
+1: Tak niewiele osób zdaje sobie sprawę, że technicznie różnica jest tylko jedna bitowa w nagłówku PE
Serge Wautier
Ciekawe, co by się stało w wywiadzie, gdybyś odpowiedział w ten sposób. Them: „Jaka jest różnica między biblioteką DLL a plikiem EXE?” Ty: „One Bit”.
JMI MADISON
3

Plik .exe to program. .Dll to biblioteka, do której może odwoływać się plik .exe (lub inny plik .dll).

To, co mówi sakthivignesh, może być prawdą w tym, że jeden plik .exe może używać innego, tak jakby był biblioteką, i jest to zrobione (na przykład) z niektórymi komponentami COM. W tym przypadku "slave" .exe jest oddzielnym programem (ściśle mówiąc, oddzielnym procesem - być może działającym na oddzielnym komputerze), ale takim, który przyjmuje i obsługuje żądania z innych programów / komponentów / cokolwiek.

Jeśli jednak po prostu wybierzesz losowe pliki .exe i .dll z folderu w plikach programu, istnieje prawdopodobieństwo, że COM nie ma znaczenia - to tylko program i jego dynamicznie połączone biblioteki.

Korzystając z interfejsów API Win32, program może załadować bibliotekę DLL i używać jej przy użyciu funkcji API LoadLibrary i GetProcAddress, IIRC. W Win16 były podobne funkcje.

COM jest pod wieloma względami ewolucją idei DLL, pierwotnie pomyślanej jako podstawa dla OLE2, podczas gdy .NET jest następcą COM. Biblioteki DLL istnieją od czasu Windows 1, IIRC. Pierwotnie były one sposobem współdzielenia kodu binarnego (zwłaszcza systemowych interfejsów API) między wieloma uruchomionymi programami w celu zminimalizowania użycia pamięci.

Steve314
źródło
2

EXE jest widoczny w systemie jako zwykły plik wykonywalny Win32. Jego punkt wejścia odnosi się do małego programu ładującego, który inicjuje środowisko wykonawcze .NET i nakazuje mu załadowanie i wykonanie zestawu zawartego w pliku EXE. Biblioteka DLL jest widoczna w systemie jako biblioteka DLL Win32, ale najprawdopodobniej bez punktów wejścia. Środowisko wykonawcze .NET przechowuje informacje o zawartym zestawie we własnym nagłówku.

dll to zbiór funkcji wielokrotnego użytku, w których plik .exe jest plikiem wykonywalnym, który może wywoływać te funkcje

rahul
źródło
1
Środowisko uruchomieniowe .NET nie ma nic wspólnego z .exe lub .dll, są to binarne pliki kodu maszynowego (jeśli są one tworzone w jakimś języku programowania korzystającym ze środowiska wykonawczego .NET, w grę wchodzi środowisko uruchomieniowe .NET, ale już za to odpowiada sam kod exe, a nie program ładujący system operacyjny).
Ped7g
1

Exe to program wykonywalny, podczas gdy DLL to plik, który może być ładowany i wykonywany dynamicznie przez programy.

Bhushan Bhangale
źródło
6
Ktoś prawdopodobnie czuł, że Twoja odpowiedź nie była wystarczająco szczegółowa.
JesperE
tak, ludzie mogą nie wiedzieć, czym jest program wykonywalny, a to samo w sobie staje się zupełnie nowym pytaniem.
Mindless,
1

● .exe i dll to skompilowane wersje kodu C #, które są również nazywane zestawami.

● .exe to samodzielny plik wykonywalny, co oznacza, że ​​można go uruchomić bezpośrednio.

● .dll jest składnikiem wielokrotnego użytku, którego nie można uruchomić bezpośrednio i do jego wykonania wymagane są inne programy.

Kedarnath MS
źródło
0

Różnica w DLL i EXE:

1) DLL jest komponentem w procesie, co oznacza, że ​​działa w tej samej przestrzeni pamięci co proces klienta. EXE jest komponentem wychodzącym z procesu, co oznacza, że ​​działa w oddzielnej przestrzeni pamięci.

2) Biblioteka DLL zawiera funkcje i procedury, których mogą używać inne programy (sprzyja możliwości ponownego wykorzystania), podczas gdy EXE nie może być współużytkowany z innymi programami.

3) Biblioteki DLL nie można uruchomić bezpośrednio, ponieważ zostały zaprojektowane do ładowania i uruchamiania przez inne programy. EXE to program, który jest wykonywany bezpośrednio.

rahul sharma
źródło
0

Dla tych, którzy szukają zwięzłej odpowiedzi,

  • Jeśli zestaw jest kompilowany jako biblioteka klas i udostępnia typy do użycia przez inne zestawy, ma rozszerzenie ifle .dll(biblioteka dołączana dynamicznie) i nie można go wykonać samodzielnie.

  • Podobnie, jeśli zestaw jest kompilowany jako aplikacja, ma rozszerzenie pliku .exe(plik wykonywalny) i może być wykonywany samodzielnie. Przed .NET Core 3.0 aplikacje konsolowe były kompilowane do plików dll i musiały być wykonywane przez polecenie dotnet run lub plik wykonywalny hosta. - Źródło

snr
źródło