Dll ve exe dosyası arasındaki tam farkı bilmek istiyorum.
Dll ve exe dosyası arasındaki tam farkı bilmek istiyorum.
Yanıtlar:
EXE:
DLL:
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
LibMain
işlev aracılığıyla bir bildirim alabilir .
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
DLL
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.
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.
Bahsedebileceğiniz yapıyla ilgili birkaç farklılık daha var.
Characteristics
üyeye bakılabilir . Bir DLL için, (0x2000) bayrağı açıktır. EXE için bu (0x2) bayrağıdır.IMAGE_FILE_HEADER
IMAGE_NT_HEADERS
IMAGE_FILE_DLL
IMAGE_FILE_EXECUTABLE_IMAGE
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 .
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....
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
using
sınıflar için değil ad alanları için kullanırsınız . İstisna, using static
belirtilen sınıfta ( bağlantı ) bulunan tüm statik üyeleri içe aktaran c # 6'dan elde edilebilir . using
Anahtar 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.
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.
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.
.exe
ya .dll
önemli değil? Onları gerçekten ayıran başlıktaki bayraktır .... Yani bir exe
GUI etkileşimi yoluyla bir oluşturup onu bir olarak adlandırırsam ve .dll
sonra bu bayrağı manuel olarak değiştirirsem, hala çalıştırılabilir mi?
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.
İ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.
.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.
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.
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.
● .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.
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.
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
DLL ve EXE arasında, DLL'nin bir giriş noktası olmadığı ve EXE'in sahip olduğu en büyük kesin fark. C ++ ile aşina iseniz, EXE derlemesinin main () giriş işlevine sahip olduğunu ve DLL'nin olmadığını görebilirsiniz :)