.Dll ve .exe arasındaki fark?


93

Dll ve exe dosyası arasındaki tam farkı bilmek istiyorum.


1
Buraya biraz bağlam eklemelisiniz: Başlangıç ​​seviyesiniz mi PE malzemelerinin derin bir teknik özelliğine mi bakıyorsunuz yoksa başka bir şey mi
khebbie

3
Yeni başlayan olduğum doğru. Etiketli bir röportaj sorusudur.
Umesh Aawte

Daha da önemlisi, bu sakthivignesh tarafından bir tane (silinmiş) içeren bir kopya ...
Marc Gravell

Yanıtlar:


73

EXE:

  1. Çalıştırılabilir bir dosyadır
  2. Yürütülebilir bir dosya yüklerken, hiçbir dışa aktarma çağrılır, sadece modül giriş noktası çağrılır.
  3. Bir sistem yeni yürütülebilir dosyayı başlattığında, yeni bir işlem oluşturulur
  4. Giriş iş parçacığı, bu sürecin ana iş parçacığı bağlamında çağrılır.

DLL:

  1. Bu bir Dinamik Bağlantı Kitaplığı
  2. Birden fazla dışa aktarılan sembol var.
  3. Sistem, mevcut bir işlemin içeriğine bir DLL yükler.

Daha Fazla Ayrıntı İçin: 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

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


9
Sistem bir DLL'yi iş parçacığına değil, mevcut bir SÜREÇ'e yükler. Bir işlemdeki her DLL, bir iş parçacığı başladığında veya durduğunda bir LibMainişlev aracılığıyla bir bildirim alabilir .
Daniel Earwicker

13
1. ve 2. puanlarınız% 100 doğru değil. LoadLibraryEx'i bir exe veya dll üzerinde kullanabildiğiniz için bu, bir exe veya dll'den bir giriş noktası yüklemek için GetProcAddress'i kullanabileceğiniz anlamına gelir. Bu bağlamda hem exe hem de dll dosyaları dinamik olarak bağlanabilir ve herhangi bir sayıda giriş noktasına sahip olabilir.
jussij

137

Neden herkesin bu soruyu .NET bağlamında yanıtladığını bilmiyorum. Soru genel bir soruydu ve hiçbir yerde .NET'ten bahsetmedi.

Eh, en büyük farklar:

exe

  1. Bir exe her zaman kendi adres alanında çalışır yani ayrı bir işlemdir.
  2. Bir EXE'nin amacı, kendi başına ayrı bir uygulama başlatmaktır.

DLL

  1. Bir dll'nin çalışması için her zaman bir host exe'ye ihtiyacı vardır. yani, kendi adres alanında asla çalışamaz.
  2. Bir DLL'nin amacı, başka bir uygulamadan yeniden kullanılabilen bir yöntem / sınıf koleksiyonuna sahip olmaktır.
  3. DLL, Microsoft'un paylaşılan bir kitaplık uygulamasıdır.

DLL ve exe'nin dosya formatı esasen aynıdır. Windows, dosyadaki PE Başlığı aracılığıyla DLL ve EXE arasındaki farkı tanır. PE Başlığının ayrıntıları için MSDN'deki bu Makaleye göz atabilirsiniz.


4
Öyleyse, bir dll'yi exe'ye dönüştürmek için fikle'nin başlığını yeniden adlandırmanızı ve düzenlemenizi istediyseniz veya tersi?
RCIX

@RCIX: Bunun mümkün olduğundan şüpheliyim?
VoodooChild

Muhtemelen mümkün değil - aşağıdaki kichik'in cevabına bakın.
Jonathon Reinhart

32

Aradaki fark, bir EXE'nin bir giriş noktasına, yürütme sırasında çalışacak bir "ana" yönteme sahip olmasıdır.

Bir DLL içindeki kodun başka bir uygulamadan çağrılması gerekir.


12
Bu yanlış yüklemedir, DLL'lerin giriş noktalarına sahip olmadığı anlamına gelir. DLL'ler, (diğer şeylerin yanı sıra) DLL işleme yüklendiğinde çağrılan bir DLLMain giriş noktasına sahip olabilir
jay.lee

29

Bahsedebileceğiniz yapıyla ilgili birkaç farklılık daha var.

  1. Hem DLL hem de EXE aynı dosya yapısını paylaşır - Portable Executable veya PE. İkisini birbirinden ayırmak için içerideki Characteristicsüyeye bakılabilir . Bir DLL için, (0x2000) bayrağı açıktır. EXE için bu (0x2) bayrağıdır.IMAGE_FILE_HEADERIMAGE_NT_HEADERSIMAGE_FILE_DLLIMAGE_FILE_EXECUTABLE_IMAGE
  2. PE dosyaları bazı başlıklardan ve bir dizi bölümden oluşur. Genellikle kod için bir bölüm, veriler için bir bölüm, içe aktarılan işlevleri listeleyen bir bölüm ve kaynaklar için bir bölüm vardır. Bazı bölümler birden fazla şey içerebilir. Başlık ayrıca bölümlerde bulunan veri dizinlerinin bir listesini açıklar. Bu veri dizinleri, Windows'un PE'de ihtiyaç duyduklarını bulmasını sağlar. Ancak, bir EXE'nin asla sahip olmayacağı bir veri dizini türü (bir frankenstein EXE oluşturmadığınız sürece) dışa aktarma dizinidir. Bu, DLL dosyalarının dışa aktardıkları işlevlerin bir listesine sahip olduğu ve diğer EXE veya DLL dosyaları tarafından kullanılabileceği yerdir. Diğer tarafta, her DLL ve EXE, çalıştırılması gereken işlevleri ve DLL dosyalarını listelediği bir içe aktarma dizinine sahiptir.
  3. Ayrıca PE başlıklarında ( IMAGE_OPTIONAL_HEADER) ImageBaseüyedir. PE'nin yükleneceğini varsaydığı sanal adresi belirtir. Başka bir adrese yüklenirse, bazı işaretçiler yanlış belleğe işaret edebilir. EXE dosyaları yeni adres alanlarına ilk yüklenenler arasında olduğundan, Windows yükleyici sabit bir yükleme adresi sağlayabilir ve bu genellikle 0x00400000'dir. Bu lüks bir DLL için mevcut değil. Aynı işleme yüklenen iki DLL dosyası aynı adresi isteyebilir. Bu nedenle, bir DLL dosyasının Temel Yer Değiştirme Dizini adı verilen ve genellikle kendi bölümünde bulunan başka bir veri dizini vardır - .reloc. Bu dizin, DLL'de doğru belleğe işaret etmeleri için yeniden derlenmesi / yamalanması gereken yerlerin bir listesini içerir. Çoğu EXE dosyası bu dizine sahip değildir, ancak bazı eski derleyiciler onları oluşturur.

Bu konu hakkında daha fazla bilgi edinebilirsiniz @ MSDN .


2
1. Bunlar işaretler olduğundan, her ikisi de aynı anda ayarlanabilir. 2. Dediğin gibi, bu mümkündür, ancak yok olma olasılığı düşüktür. 3. ASLR yapabiliyorsa exe'yi de yeniden konumlandıracaktır. Yani evet, bir exe bile yer değiştirebilir. Sonuç olarak, DLL olan EXE'ler olasıdır ancak nadirdir .
Deduplicator

22

Bu cevap düşündüğümden biraz daha ayrıntılıydı ama baştan sona okudum.

DLL:
Çoğu durumda, bir DLL dosyası bir kitaplıktır . Dinamik ve statik olmak üzere birkaç kitaplık türü vardır - farkı okuyun . DLL, dinamik bağlantı kitaplığı anlamına gelir ve bize bunun programın bir parçası olduğunu, ancak her şeyin olmadığını söyler . Birden fazla program için kullanabileceğiniz yeniden kullanılabilir yazılım bileşenlerinden ( kitaplık ) oluşur . Kitaplık kaynak kodunu kopyala-yapıştır kullanarak birçok uygulamada kullanmanın her zaman mümkün olduğunu unutmayın, ancak bir DLL / Statik Kitaplık fikri, bir kitaplığın kodunu güncelleyebileceğiniz ve aynı zamanda kullanarak tüm uygulamaları güncelleyebileceğinizdir. o - derlemeden.

Örneğin: Button gibi bir Windows GUI bileşeni
oluşturduğunuzu hayal edin . Çoğu durumda, yazdığınız kodu yeniden kullanmak istersiniz çünkü karmaşık ama ortak bir bileşen - Birçok uygulamanın onu kullanmasını istiyorsunuz, ancak onlara kaynak kodunu vermek istemiyorsunuz. Kopyalayamazsınız her programda düğmenin kodunu yapıştırın, böylece bir DL Kitaplığı (DLL) oluşturmak istediğinize karar verirsiniz .

Bu "düğme" kitaplığı, EXE kesilebilir dosyalarının çalışması için gereklidir ve düğme olmadan çalışmazlar çünkü düğmeyi nasıl oluşturacaklarını bilmiyorlar, yalnızca onunla nasıl konuşacaklarını bilmiyorlar.

Benzer şekilde, bir DLL yürütülemez - çalıştırılabilir, çünkü programın sadece bir parçasıdır, ancak bir "işlem" oluşturmak için gerekli bilgilere sahip değildir .

EXE:
Bir yürütülebilir programdır . Bir işlemin nasıl oluşturulacağını ve DLL ile nasıl konuşulacağını bilir . Bu ihtiyacı bir düğme oluşturmak için DLL ve onsuz uygulama çalışmaz - HATA.

Bu yardımcı olur umarım....


.NET geliştirme dünyasında, örneğin C # gibi diğer modüllerden bir şeyler içe aktarırken using SomeClassFromALibrary, bu kitaplık bir DLL aracılığıyla projeye bağlanır? Sadece doğru anlayıp anlamadığımı görmeye çalışıyorum
Abdul

Normalde anahtar kelimeyi usingsınıflar için değil ad alanları için kullanırsınız . İstisna, using staticbelirtilen sınıfta ( bağlantı ) bulunan tüm statik üyeleri içe aktaran c # 6'dan elde edilebilir . usingAnahtar kelime zamanında o içeren bir kütüphane olacağı derleyici bir söz verir ad . Kitaplık, bu DLL aracılığıyla projeye bağlı değildir, DLL, projeye (derlemeye) bağlı kitaplıktır. Bu DLL, derleme zamanında vaat edilen tüm kodu içerir.
Darius

17

Hem DLL hem de EXE, Taşınabilir Yürütülebilir (PE) Biçimleridir

Bir Dinamik bağlantı kitaplığı (DLL) bir kütüphane ve bu nedenle doğrudan idam edilemez. Çalıştırmayı denerseniz, eksik giriş noktasıyla ilgili bir hata alırsınız. Yürütülmesi için bir giriş noktasına (ana işlev) ihtiyacı vardır, bu giriş noktası herhangi bir uygulama veya exe olabilir. DLL bağlama, çalışma zamanında gerçekleşir. Bu yüzden ona "Dinamik Bağlantı" kütüphanesi deniyor.

Bir çalıştırılabilir (EXE) çalıştırılabilir bir programdır. Kendi giriş noktası vardır. PE başlığının içindeki bir bayrak, bunun ne tür bir dosya olduğunu gösterir (dosya uzantısından bağımsız olarak). PE başlığı, programın giriş noktasının bulunduğu bir alana sahiptir. DLL'lerde kullanılmaz (veya en azından bir giriş noktası olarak kullanılmaz).

Başlık bilgilerini kontrol etmek için birçok yazılım mevcuttur. Her ikisinin de farklı çalışmasına neden olan tek fark, aşağıdaki diyagramda gösterildiği gibi başlıktaki bittir.

başlık

EXE dosyasının sadece tek bir ana girişi vardır, bunun izole bir uygulama olduğu anlamına gelir, bir sistem exe'yi başlattığında, DLL'lerin birçok giriş noktası varken yeni bir işlem oluşturulur, bu nedenle uygulama onu kullandığında yeni işlem başlatılmaz, DLL yeniden kullanılabilir ve sürümlendirilebilir. DLL, farklı programlar aynı dll'yi kullanabildiğinden depolama alanını azaltır.


3
Sen Yani uzantısı olup olmadığı Bu ne anlama geliyor --- "PE başlığı içinde bir bayrak o (dosya uzantısı alakasız) 'dir dosyanın hangi tip gösterir" demek .exeya .dllönemli değil? Onları gerçekten ayıran başlıktaki bayraktır .... Yani bir exeGUI etkileşimi yoluyla bir oluşturup onu bir olarak adlandırırsam ve .dllsonra bu bayrağı manuel olarak değiştirirsem, hala çalıştırılabilir mi?
Abdul

6

Dll v / s Exe

1) DLL dosyası, exe dosyalarında ve diğer dll dosyalarında kullanılabilen dinamik bir bağlantı kitaplığıdır.
EXE dosyası, işletim sistemi tarafından yönetilen ayrı bir işlemde çalışan yürütülebilir bir dosyadır.

2) DLL'ler doğrudan çalıştırılabilir değildir. Programlar ve diğer DLL'ler tarafından hesaplamaları ve işlevleri gerçekleştirmek için çağrılabilen işlevleri içeren ayrı dosyalardır.
EXE, yürütülebilen bir programdır. Ör: Windows programı

3) Yeniden Kullanılabilirlik
DLL'si: Başka bir uygulama için yeniden kullanılabilirler. Kodlayıcı, DLL dosyasındaki işlevlerin ve prosedürlerin adlarını ve parametrelerini bildiği sürece.
EXE: Yalnızca belirli bir amaç için.

4) Bir DLL, çağıran uygulamanın aynı işlemi ve bellek alanını paylaşırken, bir
EXE ayrı işlem ve bellek alanını oluşturur.

5)
DLL kullanır : Birçok uygulamanın onu kullanmasını istiyorsunuz, ancak onlara kaynak kodunu vermek istemiyorsunuz Her programda düğmenin kodunu kopyalayıp yapıştıramazsınız, bu nedenle bir DL- oluşturmak istediğinize karar verirsiniz. Kitaplık (DLL).

EXE: Windows Forms Uygulamaları, Konsol Uygulamaları, WPF Uygulamaları ve Windows Hizmetleri gibi proje şablonları ile çalıştığımızda, derlendiğinde bir exe derlemesi oluştururlar.

6) Benzerlikler:
Hem DLL hem de EXE ikili dosyalardır, Taşınabilir Yürütülebilir format tarafından tanımlanan karmaşık bir iç içe geçmiş yapıya sahiptir ve kullanıcılar tarafından düzenlenebilir olmaları amaçlanmamıştır.


4

İki şey: uzantı ve dosyada depolanan başlık bayrağı.

Her iki dosya da PE dosyalarıdır. Her ikisi de aynı düzeni içerir. Bir DLL bir kitaplıktır ve bu nedenle yürütülemez. Çalıştırmayı denerseniz, eksik giriş noktasıyla ilgili bir hata alırsınız. EXE, yürütülebilen bir programdır. Bir giriş noktası var. PE başlığının içindeki bir bayrak, bunun hangi dosya türü olduğunu gösterir (dosya uzantısından bağımsız olarak). PE başlığı, programın giriş noktasının bulunduğu bir alana sahiptir. DLL'lerde kullanılmaz (veya en azından bir giriş noktası olarak kullanılmaz).

Küçük bir fark, çoğu durumda DLL'lerin sembollerin dışa aktarıldığı bir dışa aktarma bölümüne sahip olmasıdır. EXE'ler kitaplık olmadıkları için asla bir dışa aktarma bölümüne sahip olmamalıdır, ancak hiçbir şey bunun olmasını engellemez. Win32 yükleyici her iki yolu da umursamıyor.

Bunun dışında aynılar. Özetle, EXE'ler yürütülebilir programlardır, DLL'ler ise bir işleme yüklenen kitaplıklardır ve güvenlik, veritabanı erişimi veya başka bir şey gibi bazı yararlı işlevler içerir.


3
+1: Çok az kişi teknik olarak farkın PE başlığında yalnızca bir bit olduğunun farkında
Serge Wautier

Bir röportajda böyle cevaplarsanız ne olacağını merak ediyorum. Onlar: "DLL ve EXE arasındaki fark nedir?" Siz: "Bir Bit".
JMI MADISON

3

.Exe, programdır. .Dll, bir .exe'nin (veya başka bir .dll'nin) çağırabileceği bir kitaplıktır.

Sakthivignesh'in söylediği şey, bir .exe'nin diğerini bir kitaplıkmış gibi kullanabileceği ve (örneğin) bazı COM bileşenleriyle yapıldığı için doğru olabilir. Bu durumda, "köle" .exe ayrı bir programdır (kesinlikle konuşursak, ayrı bir işlem - belki ayrı bir makinede çalışır), ancak diğer programlardan / bileşenlerden / her neyse, istekleri kabul eden ve işleyen bir programdır.

Bununla birlikte, Program Dosyalarınızdaki bir klasörden rastgele bir .exe ve .dll seçerseniz, olasılıklar COM ile ilgili değildir - bunlar yalnızca bir program ve dinamik olarak bağlantılı kitaplıklarıdır.

Win32 API'lerini kullanan bir program, LoadLibrary ve GetProcAddress API işlevleri, IIRC'yi kullanarak bir DLL yükleyebilir ve kullanabilir. Win16'da benzer işlevler vardı.

COM, birçok yönden DLL fikrinin bir evrimidir ve başlangıçta OLE2'nin temeli olarak kabul edilir, oysa .NET, COM'un soyundan gelir. DLL'ler Windows 1, IIRC'den beri var. Bunlar başlangıçta bellek kullanımını en aza indirmek için birden çok çalışan program arasında ikili kodu (özellikle sistem API'leri) paylaşmanın bir yoluydu.


2

Bir EXE, sistem tarafından normal bir Win32 yürütülebilir dosyası olarak görülebilir. Giriş noktası, .NET çalışma zamanını başlatan ve EXE'de bulunan derlemeyi yüklemesini ve yürütmesini söyleyen küçük bir yükleyiciye işaret eder. Bir DLL, sistem tarafından Win32 DLL olarak görülebilir, ancak büyük olasılıkla herhangi bir giriş noktası yoktur. .NET çalışma zamanı, içerilen derleme hakkındaki bilgileri kendi başlığında depolar.

dll, .exe olarak bu işlevleri çağırabilen bir yürütülebilir dosya olan yeniden kullanılabilir işlevler koleksiyonudur.


1
.NET çalışma zamanının .exe veya .dll ile hiçbir ilgisi yoktur, bunlar ikili makine kod dosyalarıdır (Bunlar .NET çalışma zamanını kullanan bazı programlama dillerinde üretiliyorsa, .NET çalışma zamanı söz konusudur, ancak bu zaten exe kodunun kendisi, işletim sistemi yükleyicisi değil).
Ped7g

1

Bir exe yürütülebilir bir programdır, oysa DLL, programlar tarafından dinamik olarak yüklenebilen ve çalıştırılabilen bir dosyadır.


6
Muhtemelen birisi cevabınızın yeterince ayrıntılı olmadığını düşünmüştür.
JesperE

evet, insanlar çalıştırılabilir bir programın ne olduğunu bilmeyebilir ve bu tamamen yeni bir soru haline gelir.
Mindless

1

● .exe ve dll, derlemeler olarak da adlandırılan c # kodunun derlenmiş sürümüdür.

● .exe, bağımsız bir yürütülebilir dosyadır, yani doğrudan çalıştırılabilir.

● .dll, doğrudan çalıştırılamayan yeniden kullanılabilir bir bileşendir ve onu yürütmek için başka programlara ihtiyaç duyar.


0

DLL ve EXE arasındaki fark:

1) DLL bir İşlem İçi Bileşendir, yani istemci işlemiyle aynı bellek alanında çalışır. EXE bir İşlem Dışı Bileşendir, yani kendi ayrı bellek alanında çalışır.

2) DLL, diğer programların kullanabileceği (yeniden kullanılabilirliği teşvik eden) işlev ve prosedürleri içerirken, EXE diğer programlarla paylaşılamaz.

3) DLL, diğer programlar tarafından yüklenmek ve çalıştırılmak üzere tasarlandıkları için doğrudan yürütülemez. EXE, doğrudan yürütülen bir programdır.


0

Kısa bir cevap arayanlar için,

  • Bir derleme , bir sınıf kitaplığı olarak derlenirse ve diğer derlemelerin kullanması için türler sağlarsa, bu durumda ifle uzantısına .dll(dinamik bağlantı kitaplığı) sahiptir ve bağımsız olarak yürütülemez.

  • Benzer şekilde, bir derleme bir uygulama olarak derlenirse, dosya uzantısına .exe(yürütülebilir) sahiptir ve bağımsız olarak çalıştırılabilir. .NET Core 3.0'dan önce, konsol uygulamaları .dll dosyalarına derleniyordu ve dotnet çalıştırma komutu veya çalıştırılabilir bir ana bilgisayar tarafından yürütülmeleri gerekiyordu. - Kaynak


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.