.dllと.exeの違いは?


91

dllファイルとexeファイルの正確な違いを知りたい。


1
ここにいくつかのコンテキストを追加する必要があります:初心者ですか?PEスタッフのある種の深い技術仕様または何か他のものを探していますか
ケビ09

3
確かに私は初心者です。タグ付きの面接質問です。
Umesh Aawte 2009

さらに重要なことに、これはsakthivigneshによる1つ(削除済み)を含む複製です...
マークグラベル

回答:


71

EXE:

  1. 実行ファイルです
  2. 実行可能ファイルをロードする場合、エクスポートは呼び出されず、モジュールのエントリポイントのみが呼び出されます。
  3. システムが新しい実行可能ファイルを起動すると、新しいプロセスが作成されます
  4. エントリスレッドは、そのプロセスのメインスレッドのコンテキストで呼び出されます。

DLL:

  1. ダイナミックリンクライブラリです
  2. 複数のエクスポートされたシンボルがあります。
  3. システムはDLLを既存のプロセスのコンテキストにロードします。

詳細: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

リファレンス:http : //www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx


9
システムはDLLをスレッドではなく既存のプロセスにロードします。プロセス内のすべてのDLLは、スレッドを開始または停止したときに、LibMain関数を介して通知を受け取ることができます。
Daniel Earwicker、2009

13
ポイント1と2は100%正しくありません。LoadLibraryExをexeまたはdllで使用できるため、GetProcAddressを使用して、exeまたはdllからエントリポイントをロードできます。したがって、その点では、exeファイルとdllファイルの両方を動的にリンクでき、エントリポイントをいくつでも持つことができます。
jussij 2009

132

なぜ誰もが.NETのコンテキストでこの質問に答えているのかわかりません。質問は一般的なものであり、.NETについては言及されていません。

主な違いは次のとおりです。

EXE

  1. exeは常に独自のアドレススペースで実行されます。つまり、exeは別のプロセスです。
  2. EXEの目的は、独自の別のアプリケーションを起動することです。

DLL

  1. DLLを実行するには、常にホストexeが必要です。つまり、独自のアドレス空間で実行することはできません。
  2. DLLの目的は、他のアプリケーションから再利用できるメソッド/クラスのコレクションを持つことです。
  3. DLLは、Microsoftによる共有ライブラリの実装です。

DLLとexeのファイル形式は基本的に同じです。Windowsは、ファイルのPEヘッダーを通じてDLLとEXEの違いを認識します。PEヘッダーの詳細については、MSDNのこの記事をご覧ください。


4
それで、もしあなたがあなたが名前を変更してfikleのヘッダーを編集してdllをexeにそしてその逆にしたいなら?
RCIX 2009

@RCIX:それが可能かどうか疑問に思いますか?
VoodooChild 2010年

それはおそらく不可能です-以下のキチクの答えを見てください。
Jonathon Reinhart 2013

31

違いは、EXEにはエントリポイント、つまり実行時に実行される「メイン」メソッドがあることです。

DLL内のコードは、別のアプリケーションから呼び出す必要があります。


11
これは誤ロードであり、DLLにエントリポイントがないことを意味します。DLLには、(とりわけ)DLLがプロセスにロードされたときに呼び出されるDLLMainエントリポイントがある場合があります
jay.lee

29

言及できる構造に関しては、さらにいくつかの違いがあります。

  1. DLLとEXEの両方が同じファイル構造(ポータブル実行可能ファイル、またはPE)を共有します。2つを区別するには、inside のCharacteristicsメンバーを調べます。DLLの場合、(0x2000)フラグがオンになっています。EXEの場合はIMAGE_FILE_HEADERIMAGE_NT_HEADERSIMAGE_FILE_DLLIMAGE_FILE_EXECUTABLE_IMAGE(0x2)フラグです。
  2. PEファイルは、いくつかのヘッダーといくつかのセクションで構成されています。通常、コードのセクション、データのセクション、インポートされた関数をリストするセクション、リソースのセクションがあります。一部のセクションには複数のものが含まれている場合があります。ヘッダーには、セクションにあるデータディレクトリのリストも記載されています。これらのデータディレクトリにより、WindowsはPEで必要なものを見つけることができます。ただし、EXEが作成できないデータディレクトリの1つのタイプは(フランケンシュタインEXEを構築している場合を除き)、エクスポートディレクトリです。DLLファイルには、エクスポートする関数のリストがあり、他のEXEファイルやDLLファイルで使用できます。一方、各DLLとEXEには、実行に必要な関数とDLLファイルをリストするインポートディレクトリがあります。
  3. また、PEヘッダー(IMAGE_OPTIONAL_HEADER)にはImageBaseメンバーがあります。これは、PEがロードされると想定する仮想アドレスを指定します。別のアドレスに読み込まれると、一部のポインタが間違ったメモリを指す可能性があります。EXEファイルは最初に新しいアドレススペースにロードされるため、Windowsローダーは一定のロードアドレスを保証できます。これは通常0x00400000です。DLLにはその贅沢はありません。同じプロセスに読み込まれた2つのDLLファイルは、同じアドレスを要求できます。DLLに、通常は独自のセクションにあるBase Relocation Directoryと呼ばれる別のデータディレクトリがある理由.relocです。このディレクトリには、正しいメモリを指すようにリベース/パッチを適用する必要があるDLL内の場所のリストが含まれています。ほとんどのEXEファイルにはこのディレクトリがありませんが、一部の古いコンパイラはそれらを生成します。

このトピックの詳細については、MSDNを参照してください


1
1.これらはフラグなので、両方を同時に設定できます。2.あなたが言ったように、それは可能ですが、消失する可能性はほとんどありません。3. ASLRは、可能であれば、exeも再配置します。だから、はい、exeでも再配置できます。全体として、DLLであるEXEは可能ですが、まれです。
Deduplicator 2018年

20

この答えは、私が思ったよりも少し詳細でしたが、読み通しました。

DLL:
ほとんどの場合、DLLファイルはライブラリです。ライブラリには、動的と静的の2種類のタイプがあります- 違いについて読んでください。DLLはダイナミックリンクのライブラリ、それはだということを教えてくれるパートプログラムが、のではない全部。再利用可能なソフトウェアコンポーネント(ライブラリ)で構成されており、複数のプログラムで使用できます。。コピーと貼り付けを使用して多くのアプリケーションでライブラリのソースコードを使用することは常に可能ですが、DLL /静的ライブラリの考え方は、ライブラリのコードを更新し、同時にすべてのアプリケーションを更新できることです。それ-コンパイルせずに。

例えば:
ButtonのようなWindows GUIコンポーネントを 作成しているとしましょう。ほとんどの場合、記述したコードは複雑ですが一般的なコンポーネントであるため、再利用する必要があります-多くのアプリケーションで使用したいが、ソースコードを提供したくないコピーできない-ボタンのコードをすべてのプログラムに貼り付けて、DL-Library(DLL)を作成することを決定します。

この「ボタン」ライブラリはEXEで必要です実行可能ファイルを実行するために必要であり、それがないとボタンの作成方法がわからないため、実行することはできません。

同様に、DLLを実行することはできません。DLLはプログラムの一部であり、「プロセス」を作成するために必要な情報がないためです。

EXE:
実行可能ファイルはプログラムです。プロセスを作成する方法とDLLと通信する方法を知っています。ボタンを作成するにはDLL が必要ですが、それないとアプリケーションは実行されません-エラー。

お役に立てれば....


.NET開発の世界では、C#などの他のモジュールから物をインポートする場合using SomeClassFromALibrary、そのライブラリはDLLを介してプロジェクトにリンクされていますか?私が正しく理解しているかどうかを確認しようとしています
Abdul

キーワードusingは通常、クラスではなく名前空間に使用します。例外は、using static指定されたクラス(link)に存在するすべての静的メンバーをインポートするc#6から利用可能です。usingキーワードは、実行時にその含むライブラリが存在することをコンパイラに約束与え名前空間を。ライブラリはそのDLLを介してプロジェクトにリンクされていません。DLLはプロジェクト(アセンブリ)にリンクされているライブラリです。そのDLLには、コンパイル時に約束されたすべてのコードが含まれています。
ダリウス

16

DLLとEXEはどちらもPortable Executable(PE)形式です。

ダイナミックリンクライブラリ(DLL)はライブラリであるため、直接実行することはできません。実行しようとすると、エントリポイントが見つからないというエラーが発生します。実行するにはエントリポイント(メイン関数)が必要です。そのエントリポイントは、任意のアプリケーションまたはexeにすることができます。DLLバインディングは実行時に発生します。これが「ダイナミックリンク」ライブラリと呼ばれる理由です。

AN 実行可能(EXE)は、実行可能なプログラムです。独自のエントリポイントがあります。PEヘッダー内のフラグは、それがどのタイプのファイルかを示します(ファイル拡張子とは関係ありません)。PEヘッダーには、プログラムのエントリポイントが存在するフィールドがあります。DLLでは使用されません(または少なくともエントリポイントとしては使用されません)。

ヘッダー情報をチェックするために利用できる多くのソフトウェアがあります。以下の図に示すように、両方の動作が異なる唯一の違いは、ヘッダーのビットです。

ヘッダ

EXEファイルのメインエントリは1つだけであることを意味します。これは、分離されたアプリケーションであることを意味します。システムがexeを起動すると、新しいプロセスが作成されますが、DLLには多くのエントリポイントがあるため、アプリケーションが新しいプロセスを使用しないと、DLLを再利用してバージョン管理できます。異なるプログラムが同じdllを使用できるため、DLLはストレージスペースを削減します。


3
あなたはそうは拡張子があるかどうかそれがどういう意味---「PEヘッダー内のフラグは、それが(ファイル拡張子の無関係)で、ファイルの種類を示します」と言う.exeか、.dll問題ではありませんか?それらを本当に区別するのはヘッダーのそのフラグです...それで、私がを作成し、exeGUIインタラクションを介してとして名前を付けた場合.dll、そのフラグを手動で変更しても、引き続き実行可能ですか?
Abdul

4

2つ:ファイルに保存されている拡張子とヘッダーフラグ。

どちらのファイルもPEファイルです。どちらにもまったく同じレイアウトが含まれています。DLLはライブラリであるため、実行できません。実行しようとすると、エントリポイントが見つからないというエラーが発生します。EXEは実行可能なプログラムです。エントリポイントがあります。PEヘッダー内のフラグは、それがどのファイルタイプであるかを示します(ファイル拡張子とは関係ありません)。PEヘッダーには、プログラムのエントリポイントが存在するフィールドがあります。DLLでは使用されません(または少なくともエントリポイントとしては使用されません)。

1つの小さな違いは、ほとんどの場合、DLLにはシンボルがエクスポートされるエクスポートセクションがあることです。EXEはライブラリではないため、エクスポートセクションを含めることはできませんが、それが発生するのを妨げるものはありません。Win32ローダーはどちらの方法でもかまいません。

それ以外は同じです。つまり、要約すると、EXEは実行可能プログラムであり、DLLはプロセスにロードされるライブラリであり、セキュリティ、データベースアクセスなどの便利な機能が含まれています。


3
+1:技術的に、違いはPEヘッダーの1ビットだけであることを理解している人はほとんどいない
Serge Wautier

こう答えたら面接でどうなるのかな。それら:「DLLとEXEの違いは何ですか?」あなた:「ワンビット」。
JMIマディソン

4

DLL v / sエグゼ

1)DLLファイルは、exeファイルやその他のdllファイルで使用できるダイナミックリンクライブラリです。
EXEファイルは、OSによって管理される別のプロセスで実行される実行可能ファイルです。

2)DLLは直接実行できません。これらは、プログラムや他のDLLが呼び出して計算や関数を実行できる関数を含む個別のファイルです。
EXEは実行可能なプログラムです。例:Windowsプログラム

3)再利用
DLL:他のアプリケーションで再利用できます。コーダーがDLLファイル内の関数とプロシージャの名前とパラメータを知っている限り。
EXE:特定の目的のみ。

4)DLLは呼び出し側アプリケーションと同じプロセスとメモリ空間を共有しますが、
EXEは個別のプロセスとメモリ空間を作成します。

5)
DLLを使用する:多くのアプリケーションで使用したいが、ソースコードを提供したくないすべてのプログラムでボタンのコードをコピーして貼り付けることはできないため、DL-を作成することにします。ライブラリ(DLL)。

EXE:Windowsフォームアプリケーション、コンソールアプリケーション、WPFアプリケーション、Windowsサービスなどのプロジェクトテンプレートを使用すると、コンパイル時にexeアセンブリが生成されます。

6)類似性:
DLLとEXEはどちらもバイナリファイルで、ポータブル実行可能形式で定義された複雑な入れ子構造になっており、ユーザーが編集できるようには設計されていません。


2

.exeがプログラムです。.dllは、.exe(または別の.dll)が呼び出すライブラリです。

ある.exeが別の.exeをライブラリのように使用できるという点でsakthivigneshの言うことが当てはまる可能性があり、これは(たとえば)一部のCOMコンポーネントで行われます。この場合、「スレーブ」の.exeは別のプログラム(厳密には別のプロセス-おそらく別のマシンで実行されています)ですが、他のプログラム/コンポーネント/その他からの要求を受け入れて処理するものです。

ただし、Program Filesのフォルダーからランダムな.exeと.dllを選択するだけの場合、COMは関連性がない可能性があります。これらは単なるプログラムとその動的リンクライブラリです。

Win32 APIを使用すると、プログラムはLoadLibraryおよびGetProcAddress API関数、IIRCを使用してDLLをロードして使用できます。Win16にも同様の機能がありました。

COMは多くの点でDLLのアイデアを発展させたものであり、もともとはOLE2の基礎として考えられていましたが、.NETはCOMの子孫です。DLLは、Windows 1、IIRCから存在しています。もともとは、メモリの使用を最小限に抑えるために、実行中の複数のプログラム間でバイナリコード(特にシステムAPI)を共有する方法でした。


2

EXEは、通常のWin32実行可能ファイルとしてシステムに表示されます。そのエントリポイントは、.NETランタイムを初期化し、EXEに含まれるアセンブリをロードして実行するように指示する小さなローダーを参照します。DLLはシステムからWin32 DLLとして認識されますが、ほとんどの場合、エントリポイントはありません。.NETランタイムは、含まれているアセンブリに関する情報を独自のヘッダーに格納します。

dllは再利用可能な関数のコレクションで、.exeはこれらの関数を呼び出す実行可能ファイルです。


1
.NETランタイムは.exeまたは.dllとは何の関係もありません。これらはバイナリマシンコードファイルです(これらが.NETランタイムを使用しているプログラミング言語で作成されている場合、.NETランタイムが関係しますが、それはすでにexeコード自体、OSローダーではありません)。
Ped7g

1

exeは実行可能なプログラムですが、DLLはプログラムによって動的にロードおよび実行できるファイルです。


6
誰かがおそらくあなたの答えが十分に詳細ではないと感じました。
JesperE 2009

ええ、人々は実行可能プログラムが何であるかを知らないかもしれません、そしてそれは全く新しい質問になります。
マインドレス2014

1

●.exeおよびdllは、c#コードのコンパイル済みバージョンであり、アセンブリとも呼ばれます。

●.exeはスタンドアロンの実行可能ファイルです。つまり、直接実行できます。

●.dllは再利用可能なコンポーネントであり、直接実行することはできず、実行するには他のプログラムが必要です。


0

DLLとEXEの違い:

1)DLLはインプロセスコンポーネントです。つまり、クライアントプロセスと同じメモリ空間で実行されます。EXEはアウトプロセスコンポーネントです。つまり、EXEは独自のメモリスペースで実行されます。

2)DLLには、他のプログラムが使用できる(reuabilityを促進する)関数とプロシージャが含まれていますが、EXEは他のプログラムと共有できません。

3)DLLは他のプログラムによってロードおよび実行されるように設計されているため、直接実行することはできません。EXEは、直接実行されるプログラムです。


-1

投票中にコメントしてください。

簡潔な答えを探している人のために、

  • アセンブリがクラスライブラリとしてコンパイルされ、使用する他のアセンブリの型を提供する場合、そのアセンブリにはifle拡張.dll (ダイナミックリンクライブラリ)があり、スタンドアロンで実行することはできません。

  • 同様に、アセンブリがアプリケーションとしてコンパイルされている場合は、ファイル拡張子 .exe(実行可能)があり、スタンドアロンで実行できます。.NET Core 3.0以前は、コンソールアプリは.dllファイルにコンパイルされ、dotnet runコマンドまたはホスト実行可能ファイルで実行する必要がありました。- ソース


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.