DLLファイルとは正確には何で、どのように機能しますか?


224

DLLファイルはどのように機能しますか?それらの数は非常に多いようですが、それらが何であるか、どのように機能するかはわかりません。

それで、彼らとの契約は何ですか?


6
これはWindowsでのみタグ付けされており、この質問は2008年に書き戻されたので、今日ではdllは.NET Coreを使用してMacとLinuxでも実行されていることに言及する価値があります。
ジム・アホ

回答:


287

DLLとは何ですか?

ダイナミックリンクライブラリ(DLL)はEXEに似ていますが、直接実行することはできません。Linux / Unixの.soファイルに似ています。つまり、DLLはMSによる共有ライブラリの実装です。

DLLはEXEに非常に似ているため、ファイル形式自体は同じです。EXEとDLLは、どちらもPortable Executable(PE)ファイル形式に基づいています。DLLには、COMコンポーネントと.NETライブラリを含めることもできます。

DLLには何が含まれていますか?

DLLには、EXE、または他のDLLが使用する関数、クラス、変数、UI、およびリソース(アイコン、画像、ファイルなど)が含まれています。

ライブラリのタイプ:

事実上すべてのオペレーティングシステムには、2種類のライブラリがあります。静的ライブラリと動的ライブラリ。Windowsでは、ファイル拡張子は次のとおりです。静的ライブラリ(.lib)および動的ライブラリ(.dll)。主な違いは、静的ライブラリがコンパイル時に実行可能ファイルにリンクされることです。一方、ダイナミックリンクライブラリは実行時までリンクされません。

静的および動的ライブラリの詳細:

静的ライブラリはモジュール(EXEまたはDLL)の内部に直接埋め込まれているため、通常、コンピューター上では静的ライブラリは表示されません。ダイナミックライブラリは、スタンドアロンファイルです。

DLLはいつでも変更でき、EXEが明示的にDLLをロードする実行時にのみロードされます。静的ライブラリは、EXE内でコンパイルすると変更できません。DLLは、EXE自体を更新せずに個別に更新できます。

DLLのロード:

プログラムは、Win32 API LoadLibraryを介して、または別のDLLの依存関係であるDLLを起動時にロードします。プログラムは、GetProcAddressを使用して関数をロードするか、LoadResourceを使用してリソースをロードします。

参考文献:

詳細については、MSDNまたはWikipediaを確認してください。この回答の出所も。


5
おそらくどこかでインポートライブラリに言及する必要があります。OK離れます。:)
アダム・ミッツ

2
対処されているように見えるものを削除しました。どうすればポイントを獲得できますか?<g>
アダム・ミッツ

36

DLLとは何ですか?

DLLファイルは、実行可能コードと画像などのリソースを含むことができるバイナリファイルです。アプリケーションとは異なり、直接実行することはできませんが、アプリケーションは必要に応じて(または起動時に一度に)ロードします。

それらは重要ですか?

ほとんどのアプリケーションは、起動時に必要なDLLファイルをロードします。これらのいずれかが見つからない場合、システムはプロセスをまったく開始できません。

DLLファイルには他のDLLファイルが必要な場合があります

アプリケーションがDLLファイルを必要とするのと同じように、DLLファイルは他のDLLファイル自体に依存している場合があります。依存関係のチェーンでこれらのDLLファイルの1つが見つからない場合、アプリケーションはロードされません。これは、Dependency Walkerなどの依存関係ウォーカーツールを使用して簡単にデバッグできます。

それらの多くはシステムフォルダにあります

システム機能のほとんどは、コード/リソースを共有する標準形式であるため、DLLファイルの形式でユーザープログラムに公開されます。各機能は別々のDLLファイルに個別に保持されるため、必要なDLLファイルのみがロードされ、システムのメモリ制約が軽減されます。

インストールされたアプリケーションもDLLファイルを使用します

DLLファイルは、上記で説明したように、機能を物理的に分離する形式にもなります。優れたアプリケーションは、絶対に必要になるまでDLLファイルを読み込まないようにして、メモリ要件を減らします。これも、アプリケーションに多数のDLLファイルを同梱する原因になります。

DLL地獄

ただし、共有DLLファイルとそれらを必要とするプログラムとの間にバージョンの不一致がある場合、システムのアップグレードによって他のプログラムが壊れることがあります。システムチェックポイントやDLLキャッシュなどは、この問題を解決するためのM $の取り組みです。.NETプラットフォームは、この問題にまったく直面しない可能性があります。

DLLファイルの内容を知るにはどうすればよいですか?

DUMPBINやDependency Walker などの外部ツールを使用する必要があります。これにより、一般に公開されている関数(エクスポートと呼ばれる)がDLLファイル内に含まれているだけでなく、他に必要なDLLファイルやDLLファイルからのこのDLLファイルからのエクスポートも表示されます。依存しています。

それらをどのように作成/使用しますか?

ベンダーのプログラミングマニュアルを参照してください。C ++については、MSDNのLoadLibraryを参照してください。


2
この文("The .NET platform might not face this issue at all.")に理由を記入してください。ありがとう。
Jogi

1
@RehanKhan .NET Framework v2.0以降、ランタイムは.NETバージョン<=現在ロードされているランタイムでコンパイルされたアセンブルのみをロードします+ .NETはアセンブリのロードに失敗した試行もキャッシュします+前の呼び出しがすでにアセンブリを見つけた場合、CLランタイムロード済みのアセンブリを使用します。全体として、プログラムのランタイムがロードするDLLに非常に厳しい制限を適用することで問題を解決したと言ったほうがいいと思います(あきらめてあなたの助けを求める前に)。
Vladislav Martin

14

ライブラリにあるいくつかの関数を使用する実行可能ファイルを作成しているとしましょう。

使用しているライブラリがstaticの場合、リンカーはこれらの関数のオブジェクトコードをライブラリから直接コピーし、実行可能ファイルに挿入します。

この実行可能ファイルを実行すると、必要なものがすべて揃うので、実行可能ローダーはそれをメモリにロードして実行します。

ライブラリが動的な場合、リンカーはオブジェクトコードを挿入せず、基本的にはこの関数がこのDLLのこの場所にあると言うスタブを挿入します。

この実行可能ファイルを実行すると、実行可能ファイルの一部(つまり、スタブ)が欠落しているため、ローダーは実行可能ファイルを通過し、欠落しているスタブを修正します。すべてのスタブが解決されて初めて、実行可能ファイルの実行が許可されます。

この動作を確認するには、DLLを削除するか名前を変更し、実行可能ファイルを実行しようとしたときにローダーがDLLが見つからないというエラーを報告する方法を確認します。

したがって、ダイナミックリンクライブラリという名前は、リンクプロセスの一部が実行可能なローダーによって実行時に動的に行われます。

最後の注意点として、DLLにリンクしない場合、リンカーはスタブを挿入しませんが、WindowsはGetProcAddress APIを提供しており、実行可能ファイルが開始した後もDLL関数のエントリポイントを実行してロードできます。


12

DLL(ダイナミックリンクライブラリ)とSL(共有ライブラリ、UNIXで同等)は、ロード時に実行可能ファイルに動的にリンクできる実行可能コードのライブラリにすぎません。

静的ライブラリはコンパイル時に実行可能ファイルに挿入され、その時点から修正されます。実行可能ファイルのサイズが大きくなり、共有できません。

動的ライブラリには次の利点があります。

1 /それらはコンパイル時ではなく実行時にロードされるため、実行可能ファイルとは無関係に更新できます(Windowsに表示されるすべての豪華なウィンドウとダイアログボックスはDLLから取得されるため、アプリケーションのルックアンドフィールはユーザーなしで変更できます書き直す必要があります)。

2 /独立しているため、コードを複数の実行可能ファイルで共有できます。これにより、1つのDLLで100個のアプリを実行している場合、メモリ内にはDLLのコピーが1つしかないため、メモリを節約できます。

主な欠点は利点#1です。アプリケーションに依存せずにDLLを変更すると、アプリケーションが動作を停止したり、奇妙な動作をしたりする可能性があります。DLLのバージョン管理はWindowsでうまく管理されない傾向があり、これが趣のある名前の「DLL Hell」につながります。


11

DLLファイルには、呼び出し側プログラムで検索できるシンボルのリストであるエクスポートテーブルが含まれています。シンボルは通常、C呼び出し規約__stcall)を持つ関数です。エクスポートテーブルには、関数のアドレスも含まれています。

この情報を使用すると、コンパイル時にDLLにアクセスできなかった場合でも、呼び出し側プログラムはDLL内の関数を呼び出すことができます。

Dynamic Link Librariesの紹介には、いくつかの情報があります。


6

http://support.microsoft.com/kb/815065

DLLは、複数のプログラムで同時に使用できるコードとデータを含むライブラリです。たとえば、Windowsオペレーティングシステムでは、Comdlg32 DLLは、ダイアログボックスに関連する一般的な機能を実行します。したがって、各プログラムは、このDLLに含まれている機能を使用して、[開く]ダイアログボックスを実装できます。これにより、コードの再利用と効率的なメモリ使用を促進できます。

DLLを使用すると、プログラムを個別のコンポーネントにモジュール化できます。たとえば、会計プログラムはモジュール単位で販売できます。各モジュールは、そのモジュールがインストールされている場合、実行時にメインプログラムにロードできます。モジュールは独立しているため、プログラムのロード時間が速くなり、その機能が要求されたときにのみモジュールがロードされます。

さらに、プログラムの他の部分に影響を与えることなく、各モジュールに更新を簡単に適用できます。たとえば、給与計算プログラムがあり、税率が毎年変わる場合があります。これらの変更がDLLに分離されている場合、プログラム全体を再度ビルドまたはインストールする必要なく、更新を適用できます。

http://en.wikipedia.org/wiki/Dynamic-link_library


2

DLLは、Windowsプログラムの複数のコードとプロシージャを保持するために使用されるファイル拡張子であり、「ダイナミックリンクライブラリ」として知られています。ソフトウェアとゲームはDLLファイルに基づいて実行されます。DLLファイルは、複数のアプリケーションが同時に情報を使用できるように作成されました。

DLLファイルに関する詳細情報が必要な場合、またはエラーが発生した場合は、次の投稿を参照してください。 https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1

DLL(ダイナミックリンクライブラリ)には、1つ以上のアプリケーションまたはサービスで使用されるリソースが含まれています。これらには、クラス、アイコン、文字列、オブジェクト、インターフェイス、およびUI以外に開発者が格納する必要があるほとんどすべてのものを含めることができます。


3
彼らは実際にUIを保存でき、いくつかのプログラムがこれを行います。たとえば、スナップイン。
ブライアンR.ボンディ

1

マイクロソフトによると

(DLL)ダイナミックリンクライブラリは、アプリケーションの実行に必要なデータ、コード、またはリソースを含むファイルです。これらは、Windowsエコシステムによって作成され、2つ以上のアプリケーション間で共有できるファイルです。

Windowsでプログラムまたはソフトウェアを実行する場合、アプリケーションの動作方法の多くは、プログラムのDLLファイルに依存します。たとえば、特定のアプリケーションに複数のモジュールがある場合、各モジュールが相互に対話する方法は、Windows DLLファイルによって決定されます。

詳細な説明が必要な場合は、これらの役立つリソースを確認してください

dllファイルは何Dllファイルについて

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