dllファイルとexeファイルの正確な違いを知りたいです。
15 に答える
なぜ誰もが.NETのコンテキストでこの質問に答えているのかわかりません。質問は一般的なものであり、.NETについてはどこにも言及されていませんでした。
主な違いは次のとおりです。
EXE
- exeは常に独自のアドレス空間で実行されます。つまり、これは別のプロセスです。
- EXEの目的は、独自の別のアプリケーションを起動することです。
DLL
- dllを実行するには、常にホストexeが必要です。つまり、独自のアドレス空間で実行することはできません。
- DLLの目的は、他のアプリケーションから再利用できるメソッド/クラスのコレクションを持つことです。
- DLLは、Microsoftによる共有ライブラリの実装です。
DLLとexeのファイル形式は基本的に同じです。Windowsは、ファイル内のPEヘッダーを介してDLLとEXEの違いを認識します。PEヘッダーの詳細については、MSDNのこの記事を参照してください。
EXE:
- 実行ファイルです
- 実行可能ファイルをロードするとき、エクスポートは呼び出されず、モジュール エントリ ポイントのみが呼び出されます。
- システムが新しい実行可能ファイルを起動すると、新しいプロセスが作成されます
- エントリ スレッドは、そのプロセスのメイン スレッドのコンテキストで呼び出されます。
DLL:
- ダイナミック リンク ライブラリです
- 複数のエクスポートされたシンボルがあります。
- システムは、既存のプロセスのコンテキストに 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
違いは、EXE には、実行時に実行される「メイン」メソッドであるエントリ ポイントがあることです。
DLL 内のコードは、別のアプリケーションから呼び出す必要があります。
あなたが言及できる構造に関して、さらにいくつかの違いがあります。
- DLL と EXE は同じファイル構造 (Portable Executable、または PE) を共有します。2 つを区別するには、insideの
Characteristics
メンバーを調べます。DLL の場合、(0x2000) フラグがオンになっています。EXE の場合は(0x2) フラグです。IMAGE_FILE_HEADER
IMAGE_NT_HEADERS
IMAGE_FILE_DLL
IMAGE_FILE_EXECUTABLE_IMAGE
- PE ファイルは、いくつかのヘッダーといくつかのセクションで構成されています。通常、コードのセクション、データのセクション、インポートされた関数をリストするセクション、およびリソースのセクションがあります。一部のセクションには、複数のものが含まれる場合があります。ヘッダーには、セクションにあるデータ ディレクトリのリストも記述されています。これらのデータ ディレクトリにより、Windows は PE で必要なものを見つけることができます。しかし、(フランケンシュタイン EXE を構築している場合を除いて) EXE が持つことのない 1 つのタイプのデータ ディレクトリは、エクスポート ディレクトリです。これは、DLL ファイルがエクスポートする関数のリストを持ち、他の EXE または DLL ファイルで使用できる場所です。一方、各 DLL と EXE にはインポート ディレクトリがあり、実行に必要な関数と DLL ファイルがリストされています。
- また、PE ヘッダー (
IMAGE_OPTIONAL_HEADER
) にはImageBase
メンバーがあります。PE がロードされると想定する仮想アドレスを指定します。別のアドレスにロードされている場合、一部のポインタが間違ったメモリを指している可能性があります。EXE ファイルは新しいアドレス空間に最初にロードされるファイルの 1 つであるため、Windows ローダーは一定のロード アドレス (通常は 0x00400000) を保証できます。その贅沢は DLL には存在しません。同じプロセスにロードされた 2 つの DLL ファイルは、同じアドレスを要求できます。これが、DLL が Base Relocation Directory と呼ばれる別のデータ ディレクトリを持っている理由です。このディレクトリは通常、独自のセクションに存在します.reloc
。このディレクトリには、適切なメモリを指すようにリベース/パッチを適用する必要がある DLL 内の場所のリストが含まれています。ほとんどの EXE ファイルにはこのディレクトリがありませんが、一部の古いコンパイラでは生成されます。
このトピックの詳細については、@ MSDNを参照してください。
この回答は、私が思っていたよりも少し詳細でしたが、よく読んでください。
DLL:
ほとんどの場合、DLL ファイルはライブラリです。ライブラリには、動的と静的の 2 つのタイプがあります。違いについては、こちらを参照してください。DLL はダイナミック リンクライブラリの略で、プログラム全体ではなく一部であることを示しています。これは、複数のプログラムで使用できる再利用可能なソフトウェア コンポーネント (ライブラリ) で構成されています。コピー アンド ペーストを使用して多くのアプリケーションでライブラリ ソース コードを使用することは常に可能ですが、DLL/静的ライブラリの考え方は、ライブラリのコードを更新し、同時にすべてのアプリケーションを更新することです。それ - コンパイルせずに。
例: ButtonのようなWindows GUI コンポーネント
を作成しているとします。ほとんどの場合、作成したコードは複雑だが共通のコンポーネントであるため、再利用したい - 多くのアプリケーションに使用させたいが、ソースコードを提供したくない コピーできない-ボタンのコードをすべてのプログラムに貼り付けて、DL-Library (DLL)を作成することにします。
この「ボタン」ライブラリは、実行するためにEXEカット可能ファイルに必要です。これがないと実行できません。ボタンの作成方法がわからず、操作方法だけがわからないためです。
同様に、DLL はプログラムの一部にすぎず、 「プロセス」を作成するために必要な情報を持っていないため、実行できません。
EXE:
実行可能ファイルはプログラムです。プロセスの作成方法と DLL との通信方法を知っています。ボタンを作成するには DLLが必要です。DLL がないと、アプリケーションは実行されません - エラー。
お役に立てれば....
DLL と EXE はどちらもポータブル実行可能 (PE) 形式です。
ダイナミック リンク ライブラリ (DLL)はライブラリであるため、直接実行することはできません。実行しようとすると、エントリ ポイントが見つからないというエラーが表示されます。実行するにはエントリ ポイント (メイン関数) が必要です。エントリ ポイントは任意のアプリケーションまたは exe にすることができます。DLL バインディングは実行時に発生します。そのため、「ダイナミック リンク」ライブラリと呼ばれています。
Executable (EXE)は、実行可能なプログラムです。独自のエントリ ポイントがあります。PE ヘッダー内のフラグは、ファイルの種類を示します (ファイル拡張子とは関係ありません)。PE ヘッダーには、プログラムのエントリ ポイントが存在するフィールドがあります。DLL では使用されません (少なくともエントリ ポイントとしては使用されません)。
ヘッダー情報を確認するためのソフトウェアは数多くあります。両方の動作が異なる唯一の違いは、下の図に示すようにヘッダーのビットです。
EXE ファイルにはメイン エントリが 1 つしかないため、分離されたアプリケーションであることを意味します。システムが exe を起動すると、新しいプロセスが作成されますが、DLL には多くのエントリ ポイントがあるため、アプリケーションがそれを使用しても新しいプロセスが開始されず、DLL を再利用してバージョン管理できます。DLL は、異なるプログラムが同じ dll を使用できるため、ストレージ スペースを削減します。
ファイルに格納されている拡張子とヘッダー フラグの 2 つです。
どちらのファイルも PE ファイルです。どちらにもまったく同じレイアウトが含まれています。DLL はライブラリであるため、実行できません。実行しようとすると、エントリ ポイントが見つからないというエラーが表示されます。EXEは実行可能なプログラムです。エントリーポイントがあります。PE ヘッダー内のフラグは、ファイルの種類を示します (ファイル拡張子とは関係ありません)。PE ヘッダーには、プログラムのエントリ ポイントが存在するフィールドがあります。DLL では使用されません (少なくともエントリ ポイントとしては使用されません)。
1 つの小さな違いは、ほとんどの場合、 DLLにはシンボルがエクスポートされるエクスポート セクションがあることです。EXE はライブラリではないため、エクスポート セクションを持つべきではありませんが、それを妨げるものは何もありません。Win32 ローダーはどちらの方法も気にしません。
それ以外は同一です。つまり、要約すると、EXE は実行可能プログラムであり、DLL はプロセスにロードされるライブラリであり、セキュリティ、データベース アクセスなどの便利な機能が含まれています。
EXE は、通常の Win32 実行可能ファイルとしてシステムに表示されます。そのエントリ ポイントは、.NET ランタイムを初期化し、EXE に含まれるアセンブリをロードして実行するように指示する小さなローダーを参照します。DLL はシステムからは Win32 DLL として認識されますが、ほとんどの場合、エントリ ポイントはありません。.NET ランタイムは、含まれているアセンブリに関する情報を独自のヘッダーに格納します。
dll は再利用可能な関数のコレクションであり、.exe はこれらの関数を呼び出すことができる実行可能ファイルです。
.exe はプログラムです。.dll は、.exe (または別の .dll) が呼び出すことができるライブラリです。
sakthivignesh が言っていることは、ある .exe が別の .exe をライブラリのように使用できるという点で真実である可能性があり、これは (たとえば) 一部の 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) を共有する方法でした。
exeは実行可能なプログラムですが、DLLはプログラムによって動的にロードおよび実行できるファイルです。
● .exe および dll は、アセンブリとも呼ばれる c# コードのコンパイル済みバージョンです。
● .exe はスタンドアロンの実行可能ファイルです。つまり、直接実行できます。
● .dll は再利用可能なコンポーネントであり、直接実行することはできず、実行するには他のプログラムが必要です。
簡潔な答えを探している人のために、
DLL と EXE の主な正確な違いは、DLL にはエントリ ポイントがなく、EXE にはあります。C++ に精通している場合は、ビルド EXE には main() エントリ関数があり、DLL には含まれていないことがわかります:)