Perbedaan antara .dll dan .exe?

92

Saya ingin tahu perbedaan yang tepat antara file dll dan exe.

Umesh Aawte
sumber
1
Anda harus menambahkan beberapa konteks di sini: Apakah Anda seorang pemula Apakah Anda mencari semacam spesifikasi teknis yang mendalam dari barang-barang PE atau sesuatu yang lain
khebbie
3
Memang benar saya seorang pemula. Ini adalah pertanyaan wawancara seperti yang diberi tag.
Umesh Aawte
Lebih penting lagi, ini adalah duplikat termasuk satu (dihapus) oleh sakthivignesh ...
Marc Gravell

Jawaban:

73

EXE:

  1. Ini adalah file yang dapat dieksekusi
  2. Saat memuat sebuah executable, tidak ada ekspor yang dipanggil, tetapi hanya titik masuk modul.
  3. Ketika sistem meluncurkan eksekusi baru, proses baru dibuat
  4. Utas entri dipanggil dalam konteks utas utama proses itu.

DLL:

  1. Ini adalah Perpustakaan Tautan Dinamis
  2. Ada beberapa simbol yang diekspor.
  3. Sistem memuat DLL ke dalam konteks proses yang ada.

Untuk Detail Lebih Lanjut: 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

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

jempol pertama
sumber
9
Sistem memuat DLL ke dalam PROSES yang ada, bukan utas. Setiap DLL dalam suatu proses bisa mendapatkan pemberitahuan saat utas dimulai atau dihentikan, melalui suatu LibMainfungsi.
Daniel Earwicker
13
Poin 1 dan 2 Anda tidak 100% benar. Karena Anda dapat menggunakan LoadLibraryEx pada exe atau dll itu berarti Anda dapat menggunakan GetProcAddress untuk memuat titik masuk dari exe atau dll. Jadi dalam hal ini, file exe dan dll dapat ditautkan secara dinamis dan dapat memiliki sejumlah titik masuk.
jussij
135

Saya tidak tahu mengapa semua orang menjawab pertanyaan ini dalam konteks .NET. Pertanyaannya bersifat umum dan tidak menyebutkan .NET di mana pun.

Nah, perbedaan utamanya adalah:

EXE

  1. Exe selalu berjalan di ruang alamatnya sendiri yaitu, Ini adalah proses yang terpisah.
  2. Tujuan EXE adalah untuk meluncurkan aplikasi tersendiri.

DLL

  1. Dll selalu membutuhkan exe host untuk dijalankan. yaitu, ia tidak pernah dapat berjalan di ruang alamatnya sendiri.
  2. Tujuan dari DLL adalah untuk memiliki kumpulan metode / kelas yang dapat digunakan kembali dari beberapa aplikasi lain.
  3. DLL adalah implementasi pustaka bersama Microsoft.

Format file DLL dan exe pada dasarnya sama. Windows mengenali perbedaan antara DLL dan EXE melalui PE Header di file. Untuk detail Header PE, Anda dapat melihat Artikel ini di MSDN

Aamir
sumber
4
Jadi, jika Anda ingin Anda dapat mengganti nama dan mengedit header fikle untuk mengubah dll menjadi exe dan sebaliknya?
RCIX
@ RCIX: Saya ragu itu mungkin?
VoodooChild
Kemungkinan besar tidak mungkin - lihat jawaban kichik di bawah.
Jonathon Reinhart
32

Perbedaannya adalah bahwa EXE memiliki titik masuk, metode "utama" yang akan dijalankan saat eksekusi.

Kode dalam DLL perlu dipanggil dari aplikasi lain.

Robin Day
sumber
12
Ini misloading, ini menyiratkan bahwa DLL tidak memiliki titik masuk. DLL mungkin memiliki titik masuk utama DLL yang dipanggil ketika (antara lain) DLL dimuat ke dalam proses
jay.lee
29

Ada beberapa perbedaan lagi mengenai struktur yang dapat Anda sebutkan.

  1. DLL dan EXE berbagi struktur file yang sama - Portable Executable, atau PE. Untuk membedakan keduanya, seseorang dapat melihat pada Characteristicsanggota IMAGE_FILE_HEADERinside IMAGE_NT_HEADERS. Untuk DLL, IMAGE_FILE_DLLflag (0x2000) telah diaktifkan. Untuk EXE, ini adalah IMAGE_FILE_EXECUTABLE_IMAGEbendera (0x2).
  2. File PE terdiri dari beberapa header dan beberapa bagian. Biasanya ada bagian untuk kode, bagian untuk data, bagian yang mencantumkan fungsi yang diimpor dan bagian untuk sumber daya. Beberapa bagian mungkin berisi lebih dari satu hal. Header juga menjelaskan daftar direktori data yang terletak di beberapa bagian. Direktori data inilah yang memungkinkan Windows menemukan apa yang dibutuhkannya di PE. Tetapi satu jenis direktori data yang tidak akan pernah dimiliki EXE (kecuali jika Anda membuat EXE frankenstein) adalah direktori ekspor. Di sinilah file DLL memiliki daftar fungsi yang mereka ekspor dan dapat digunakan oleh file EXE atau DLL lainnya. Di sisi lain, setiap DLL dan EXE memiliki direktori impor yang mencantumkan fungsi dan file DLL yang diperlukan untuk dijalankan.
  3. Juga di header PE ( IMAGE_OPTIONAL_HEADER) adalah ImageBaseanggota. Ini menentukan alamat virtual di mana PE mengasumsikan akan dimuat. Jika dimuat di alamat lain, beberapa petunjuk mungkin mengarah ke memori yang salah. Karena file EXE adalah yang pertama dimuat ke dalam ruang alamat baru mereka, pemuat Windows dapat memastikan alamat pemuatan yang konstan dan biasanya itu 0x00400000. Kemewahan itu tidak ada untuk DLL. Dua file DLL yang dimuat ke dalam proses yang sama dapat meminta alamat yang sama. Inilah sebabnya mengapa DLL memiliki direktori data lain yang disebut Direktori Relokasi Pangkalan yang biasanya berada di bagiannya sendiri - .reloc. Direktori ini berisi daftar tempat di DLL yang perlu di-rebased / ditambal agar mengarah ke memori yang benar. Sebagian besar file EXE tidak memiliki direktori ini, tetapi beberapa kompiler lama memang menghasilkannya.

Anda dapat membaca lebih lanjut tentang topik ini @ MSDN .

kichik
sumber
2
1. Karena itu adalah flag, keduanya dapat disetel sekaligus. 2. Seperti yang Anda katakan, itu mungkin tapi tidak mungkin. 3. ASLR akan merelokasi exe juga, jika bisa. Jadi ya, bahkan exe pun bisa direlokasi. Secara keseluruhan, EXE yang merupakan DLL mungkin saja tetapi jarang .
Deduplicator
22

Jawaban ini sedikit lebih rinci dari yang saya kira, tetapi saya membacanya.

DLL:
Dalam banyak kasus, file DLL adalah pustaka . Ada beberapa jenis pustaka, dinamis dan statis - baca tentang perbedaannya . DLL adalah singkatan dari pustaka tautan dinamis yang memberi tahu kita bahwa itu adalah bagian dari program tetapi tidak semuanya. Itu terbuat dari komponen perangkat lunak yang dapat digunakan kembali ( perpustakaan ) yang dapat Anda gunakan untuk lebih dari satu program . Ingatlah bahwa selalu mungkin untuk menggunakan kode sumber perpustakaan dalam banyak aplikasi menggunakan salin-tempel, tetapi gagasan dari Perpustakaan DLL / Statis adalah Anda dapat memperbarui kode perpustakaan dan pada saat yang sama memperbarui semua aplikasi yang menggunakan itu - tanpa kompilasi.

Misalnya:
Bayangkan Anda sedang membuat komponen GUI Windows seperti Tombol . Dalam kebanyakan kasus, Anda ingin menggunakan kembali kode yang telah Anda tulis karena ini adalah komponen yang kompleks tetapi umum - Anda ingin banyak aplikasi menggunakannya tetapi Anda tidak ingin memberi mereka kode sumber Anda tidak dapat menyalin -paste kode untuk tombol di setiap program, jadi Anda memutuskan ingin membuat DL-Library (DLL) .

Ini "tombol" perpustakaan diperlukan oleh EXE cutables untuk menjalankan, dan tanpa itu mereka tidak akan berjalan karena mereka tidak tahu cara membuat tombol, hanya bagaimana berbicara dengan itu.

Demikian pula, DLL tidak dapat dijalankan - jalankan, karena ini hanya bagian dari program tetapi tidak memiliki informasi yang diperlukan untuk membuat "proses" .

EXE:
Yang dapat dieksekusi adalah program . Ia tahu bagaimana membuat proses dan bagaimana berbicara dengan DLL. Ini perlu DLL untuk membuat sebuah tombol, dan tanpa itu aplikasi tidak berjalan - ERROR.

semoga ini membantu....

hannson
sumber
Di dunia pengembangan .NET, ketika Anda mengimpor sesuatu dari modul lain, seperti misalnya, di C # using SomeClassFromALibrary, pustaka itu ditautkan ke proyek melalui DLL? Hanya mencoba untuk melihat apakah saya memahaminya dengan benar
Abdul
Anda biasanya menggunakan kata kunci usinguntuk ruang nama, bukan kelas. Pengecualian using statictersedia dari c # 6 yang mengimpor semua anggota statis yang ada di kelas yang ditentukan ( tautan ). Kata usingkunci memberikan janji kepada kompilator bahwa pada waktu proses akan ada pustaka yang berisi namespace tersebut . Pustaka tidak ditautkan ke proyek melalui DLL itu, DLL adalah pustaka yang ditautkan ke proyek (perakitan). DLL itu berisi semua kode yang dijanjikan dalam waktu kompilasi.
Darius
17

DLL dan EXE adalah Format Portable Executable (PE)

Sebuah perpustakaan dinamis-link (DLL) adalah perpustakaan dan karena itu tidak dapat dieksekusi secara langsung. Jika Anda mencoba menjalankannya, Anda akan mendapatkan kesalahan tentang titik masuk yang hilang. Diperlukan titik masuk (fungsi utama) agar dapat dieksekusi, titik masuk tersebut dapat berupa aplikasi atau exe apa pun. Pengikatan DLL terjadi pada saat run-time. Itulah mengapa disebut pustaka "Tautan Dinamis".

An Executable (EXE) adalah program yang bisa dijalankan. Ia memiliki titik masuknya sendiri. Bendera di dalam header PE menunjukkan jenis file itu (tidak relevan dengan ekstensi file). Header PE memiliki bidang tempat titik masuk untuk program berada. Dalam DLL itu tidak digunakan (atau setidaknya bukan sebagai titik masuk).

Ada banyak perangkat lunak yang tersedia untuk memeriksa informasi header. Satu-satunya perbedaan yang menyebabkan keduanya bekerja secara berbeda adalah bit di header seperti yang ditunjukkan pada diagram di bawah ini.

header

File EXE hanya memiliki satu entri utama artinya itu adalah aplikasi yang terisolasi, ketika sistem meluncurkan exe, proses baru dibuat sementara DLL memiliki banyak titik masuk sehingga ketika aplikasi menggunakannya tidak ada proses baru yang dimulai, DLL dapat digunakan kembali dan diversi. DLL mengurangi ruang penyimpanan karena program yang berbeda dapat menggunakan dll yang sama.

Zaheer Ahmed
sumber
3
Anda mengatakan "Sebuah bendera di dalam kepala PE menunjukkan jenis file itu (tidak relevan dengan ekstensi file)" --- Jadi apakah itu berarti apakah ekstensi itu penting .exeatau .dlltidak? Bendera di tajuk itulah yang benar-benar membedakannya .... Jadi jika saya membuat exedan menamainya melalui interaksi GUI sebagai .dll, tetapi kemudian mengubah tanda itu secara manual, itu masih dapat dijalankan?
Abdul
6

Dll v / s Exe

1) File DLL adalah pustaka tautan dinamis yang dapat digunakan dalam file exe dan file dll lainnya.
File EXE adalah file yang dapat dieksekusi yang berjalan dalam proses terpisah yang dikelola oleh OS.

2) DLL tidak dapat dieksekusi secara langsung. Mereka adalah file terpisah yang berisi fungsi yang dapat dipanggil oleh program dan DLL lain untuk melakukan komputasi dan fungsi.
EXE adalah program yang dapat dijalankan. Contoh: Program Windows

3) Dapat Digunakan Kembali
DLL: Mereka dapat digunakan kembali untuk beberapa aplikasi lain. Selama pembuat kode mengetahui nama dan parameter dari fungsi dan prosedur dalam file DLL.
EXE: Hanya untuk tujuan tertentu.

4) DLL akan berbagi proses dan ruang memori yang sama dari aplikasi pemanggil sementara
EXE membuat proses dan ruang memori yang terpisah.

5) Menggunakan
DLL: Anda ingin banyak aplikasi menggunakannya tetapi Anda tidak ingin memberi mereka kode sumber Anda tidak dapat menyalin-tempel kode untuk tombol di setiap program, jadi Anda memutuskan ingin membuat DL- Perpustakaan (DLL).

EXE: Ketika kami bekerja dengan templat proyek seperti Aplikasi Formulir Windows, Aplikasi Konsol, Aplikasi WPF, dan Layanan Windows, mereka menghasilkan rakitan exe saat dikompilasi.

6) Kesamaan:
DLL dan EXE adalah file biner yang memiliki struktur bersarang kompleks yang ditentukan oleh format Portable Executable, dan tidak dimaksudkan untuk dapat diedit oleh pengguna.

skanda93
sumber
4

Dua hal: ekstensi dan bendera tajuk disimpan dalam file.

Kedua file tersebut adalah file PE. Keduanya berisi tata letak yang sama persis. DLL adalah pustaka dan oleh karena itu tidak dapat dijalankan. Jika Anda mencoba menjalankannya, Anda akan mendapatkan kesalahan tentang titik masuk yang hilang. EXE adalah program yang dapat dijalankan. Ini memiliki titik masuk. Bendera di dalam header PE menunjukkan jenis file itu (tidak relevan dengan ekstensi file). Header PE memiliki kolom tempat titik masuk untuk program berada. Dalam DLL itu tidak digunakan (atau setidaknya bukan sebagai titik masuk).

Satu perbedaan kecil adalah bahwa dalam banyak kasus DLL memiliki bagian ekspor tempat simbol diekspor. EXE tidak boleh memiliki bagian ekspor karena mereka bukan perpustakaan tetapi tidak ada yang mencegah hal itu terjadi. Loader Win32 tidak peduli.

Selain itu mereka identik. Jadi, singkatnya, EXE adalah program yang dapat dieksekusi sementara DLL adalah pustaka yang dimuat ke dalam proses dan berisi beberapa jenis fungsionalitas yang berguna seperti keamanan, akses database, atau sesuatu.

judy smith
sumber
3
+1: Sangat sedikit orang yang menyadari bahwa secara teknis, perbedaannya hanya sedikit pada header PE
Serge Wautier
Saya ingin tahu apa yang akan terjadi dalam sebuah wawancara jika Anda menjawab seperti itu. Mereka: "Apa perbedaan antara DLL dan EXE?" Anda: "Satu Bit".
JMI MADISON
3

.Exe adalah programnya. .Dll adalah pustaka yang mungkin dipanggil oleh .exe (atau .dll lain).

Apa yang sakthivignesh katakan bisa jadi benar dalam satu .exe dapat menggunakan yang lain seolah-olah itu adalah perpustakaan, dan ini dilakukan (misalnya) dengan beberapa komponen COM. Dalam hal ini, "slave" .exe adalah program terpisah (sebenarnya, proses terpisah - mungkin berjalan pada mesin terpisah), tetapi program yang menerima dan menangani permintaan dari program / komponen / apa pun.

Namun, jika Anda hanya memilih .exe dan .dll acak dari folder di Program Files Anda, kemungkinan besar COM tidak relevan - mereka hanya program dan pustaka yang terhubung secara dinamis.

Menggunakan Win32 API, program dapat memuat dan menggunakan DLL menggunakan fungsi API LoadLibrary dan GetProcAddress, IIRC. Ada fungsi serupa di Win16.

COM dalam banyak hal merupakan evolusi dari ide DLL, yang awalnya dianggap sebagai dasar OLE2, sedangkan .NET adalah turunan dari COM. DLL telah ada sejak Windows 1, IIRC. Mereka awalnya adalah cara berbagi kode biner (terutama API sistem) antara beberapa program yang sedang berjalan untuk meminimalkan penggunaan memori.

Steve314
sumber
2

EXE terlihat oleh sistem sebagai executable Win32 biasa. Titik masuknya mengacu pada loader kecil yang menginisialisasi runtime .NET dan memberitahunya untuk memuat dan menjalankan rakitan yang terdapat dalam EXE. Sebuah DLL terlihat oleh sistem sebagai DLL Win32 tetapi kemungkinan besar tanpa titik masuk apa pun. Runtime .NET menyimpan informasi tentang rakitan terkandung di header sendiri.

dll adalah kumpulan fungsi yang dapat digunakan kembali dimana sebagai .exe adalah dapat dieksekusi yang dapat memanggil fungsi-fungsi ini

rahul
sumber
1
Runtime .NET tidak ada hubungannya dengan .exe atau .dll, mereka adalah file kode mesin biner (Jika itu diproduksi dalam beberapa bahasa pemrograman yang menggunakan runtime .NET, maka runtime .NET terlibat, tetapi itu sudah menjadi tanggung jawab kode exe itu sendiri, bukan OS loader).
Ped7g
1

Exe adalah program yang dapat dieksekusi sedangkan DLL adalah file yang dapat dimuat dan dijalankan oleh program secara dinamis.

Bhushan Bhangale
sumber
6
Seseorang mungkin merasa bahwa jawaban Anda tidak cukup rinci.
JesperE
ya, orang mungkin tidak tahu apa itu program yang dapat dieksekusi, dan itu menjadi pertanyaan baru itu sendiri.
Mindless
1

● .exe dan dll adalah versi terkompilasi dari kode c # yang juga disebut sebagai rakitan.

● .exe adalah file eksekusi yang berdiri sendiri, yang berarti dapat dieksekusi secara langsung.

● .dll adalah komponen yang dapat digunakan kembali yang tidak dapat dijalankan secara langsung dan membutuhkan program lain untuk menjalankannya.

Kedarnath MS
sumber
0

Perbedaan DLL dan EXE:

1) DLL adalah Komponen Dalam Proses yang berarti berjalan di ruang memori yang sama dengan proses klien. EXE adalah Out-Process Component yang berarti berjalan di ruang memori terpisahnya sendiri.

2) DLL berisi fungsi dan prosedur yang dapat digunakan oleh program lain (mempromosikan reuabilitas) sementara EXE tidak dapat dibagikan dengan program lain.

3) DLL tidak dapat langsung dijalankan karena dirancang untuk dimuat dan dijalankan oleh program lain. EXE adalah program yang dijalankan secara langsung.

rahul sharma
sumber
0

Bagi mereka yang mencari jawaban ringkas,

  • Jika sebuah assembly dikompilasi sebagai pustaka kelas dan menyediakan tipe untuk rakitan lain untuk digunakan, maka itu memiliki ekstensi ifle .dll(pustaka tautan dinamis), dan tidak dapat dijalankan secara mandiri.

  • Demikian juga, jika sebuah assembly dikompilasi sebagai aplikasi, maka ia memiliki ekstensi file .exe(dapat dieksekusi) dan dapat dijalankan secara mandiri. Sebelum .NET Core 3.0, aplikasi konsol dikompilasi ke file .dll dan harus dijalankan oleh perintah jalankan dotnet atau host yang dapat dieksekusi. - Sumber

snr
sumber
-2

Perbedaan utama antara DLL dan EXE adalah bahwa DLL tidak memiliki titik masuk dan EXE. Jika Anda terbiasa dengan c ++, Anda dapat melihat bahwa build EXE memiliki fungsi entri main () dan DLL tidak :)

faya
sumber
Menurutku tidak. Lihat di sini msdn.microsoft.com/en-us/library/ms682596(VS.85).aspx
Aamir