Chcę poznać dokładną różnicę między plikiem dll i exe.
Chcę poznać dokładną różnicę między plikiem dll i exe.
Odpowiedzi:
EXE:
DLL:
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
LibMain
funkcji.
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
DLL
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
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.
Istnieje kilka innych różnic dotyczących struktury, o których możesz wspomnieć.
Characteristics
członka IMAGE_FILE_HEADER
wewnątrz IMAGE_NT_HEADERS
. W przypadku biblioteki DLL ma IMAGE_FILE_DLL
włączoną flagę (0x2000). W przypadku EXE jest to IMAGE_FILE_EXECUTABLE_IMAGE
flaga (0x2).IMAGE_OPTIONAL_HEADER
) znajduje się ImageBase
czł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 .
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....
using SomeClassFromALibrary
, ta biblioteka jest połączona z projektem za pośrednictwem biblioteki DLL? Po prostu próbuję sprawdzić, czy dobrze rozumiem
using
dla przestrzeni nazw, a nie klas. Wyjątek jest using static
dostępny z języka C # 6, który importuje wszystkie statyczne elementy członkowskie obecne w określonej klasie ( link ). Słowo using
kluczowe 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.
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.
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.
.exe
czy .dll
nie? To ta flaga w nagłówku naprawdę je wyróżnia… Więc jeśli utworzę go exe
i nadam mu nazwę a .dll
, a potem zmienię tę flagę ręcznie, nadal będzie działać?
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.
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.
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.
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
Exe to program wykonywalny, podczas gdy DLL to plik, który może być ładowany i wykonywany dynamicznie przez programy.
● .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.
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.
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
Główna dokładna różnica między DLL i EXE, że DLL nie ma punktu wejścia, a EXE ma. Jeśli znasz C ++, możesz zobaczyć, że build EXE ma funkcję wejścia main (), a DLL nie :)