DLLとは何ですか?


90

これは非常に疑問の余地のある質問かもしれませんが、今日のWebアプリ開発の世界では、多くのプログラマーはDLLの多くに対処する必要がないため、その目的について学ぶ必要がありません。

では、dllとは何でしょうか。

  1. 何に使うの?
  2. それはどのように機能しますか?
  3. どのように作成しますか?
  4. どのような状況で適切なものを作成していますか?

dllは関数のライブラリを格納するために使用されると言われましたが、それ以上はよくわかりません。うまくいけば、ここの誰かが私を啓発してくれるので、Windowsディレクトリ内の.dllファイルがすべて何をしているのかと思ってしまうのをやめることができます。


コミュニティウィキは、質問に対する実際の回答がない場合に使用する必要があります。これは有効な質問であり、コミュニティーWikiモードを選択することにより、自分自身と回答者がこの質問で担当者を獲得するのを防ぎます。
Cody Brocious

この質問は非常に人気のある質問になる可能性があります
Tamas Czinege

1
あなたは考える?たぶん意見はあるかもしれませんが、投票はそうではありません...とにかく、すでに4回回答されています。
Omar Kooheji

2
これはささいにグーグルです...
アナカタ09年

3
ええ、これはグーグルですが、特にそれを作成することの質問とそれを使用するのが適切な場合について、私はそれについて多くの良い簡潔な説明を実際には見つけていません。
ダニエル

回答:


55

DLLはダイナミックリンクライブラリです。これは、コードやデータのコレクションであり、複数のアプリケーション(または他のライブラリ/モジュール)で使用できます。

そのため、たとえば、ファイルを処理したり、GUIコンポーネントを操作したりするための一般的な方法がライブラリで利用可能になり、複数のアプリケーションが同じ機能を使用できるようになります。これにより、同じものを複数回作成する必要が減るだけでなく、たとえば、共通のダイアログがアプリケーション間で同じになることも保証されます。

ライブラリは実行時にロードできるため、異なる並行アプリケーション間で共有できます。これは動的リンクと呼ばれます。

場合によっては、ライブラリをアプリケーション自体に含めることができます。これは静的リンクと呼ばれます。静的リンクは、異なるアプリケーションがそれぞれ同じDLLのコピーをロードするため、柔軟性を犠牲にして展開を容易にします。

ただし、静的リンクは常にオプションとは限りません。たとえば、.NETアプリケーションを静的にリンクすることはできません。ユーザーは、.NETアプリケーションを実行するために.NETライブラリーを持っている必要があり、ライブラリー(または.NETで呼び出されるアセンブリ)は実行時にロードされます。

DLLは、アプリケーションの作成に使用されるのと同じツールによって作成されます。具体的な詳細は、使用するツールに大きく依存します。


答えをありがとう、私が疑問に思っていることの1つは、どのようにしてアプリケーションがDLLで使用できる関数を知るのかということです。DLL自体はすべてマシンコードで正しいですか?それでは、dllのパブリック関数シグネチャはどのように公開されますか?
ダニエル

ほとんどの言語についてはわかりませんが、Visual Studioのオートコンプリートでは、使用可能なすべての機能が表示されます。
グラント

1
しかし、dllが単にマシンコードである場合、オートコンプリートはどのようにして利用可能な関数を見つけるのでしょうか。
ダニエル

2
マシンはマシンコードを読み取ることができます。DLLには、アイコン、文字列、フォントを含めることができます。おそらくそこのどこかに含まれているもののリストがあるでしょう。
付与

1
Visual C ++には、dumpbinと呼ばれるツールが含まれています。 "dumpbin / exports whatever.dll"を実行すると、エクスポートされる関数やデータがわかります(つまり、DLLをロードするプログラムで使用できます)。
Graeme Perrow、

29

DLL =ダイナミックリンクライブラリ

名前は実際には彼らが何を成し遂げているかを非常に説明しています。

図書館

特定の問題ドメインのコードを1つの場所に分離できます。次に、これを複数のアプリケーションで共有します。ライブラリは、バグを修正したり機能を追加したりするために、いつでも別のものと交換できます。

リンク

ライブラリをアプリケーションに「リンク」して、ライブラリのロジックがアプリケーションに直接コンパイルされないようにすることができます。

動的

ライブラリはオンデマンドでロードできます。マンモスの単一EXEをメモリにロードする代わりに、OSは必要な部分のみをロードできます。さらに、DLLがアプリケーション間で共有されている場合、OSはライブラリのロード方法を最適化し、アプリ間で共有することができます。


10

DLL(ダイナミックリンクライブラリ)ファイルは、より大きなプログラムの実行を支援するための小さな「サブプログラム」として説明できます。これらは、(実行時セッションのさまざまな時点で)さまざまなハードウェアおよびソフトウェアリソースを、「必要に応じて」ベースで、それらが基づいているメインの実行可能プログラムにリンクする手段を提供します。これにより、プログラムが最初に実行されたときに、メインの実行可能プログラムに関するすべてをコンピュータのRAM(ランダムアクセスメモリ)にロードする必要がなくなります。

DLLによって運ばれるソフトウェアリソースには、プログラムの実行を維持するために実際には必要ではないさまざまなプログラム機能のコードが含まれます。つまり、特定のコンピューティングセッション中の特定の時間にのみ呼び出す必要があり、実際には必要ない場合もあります。まったく呼ばれません。プログラムが最初に実行されたときにコンピューターのRAMにそれらの関数(および特定のプログラムにはかなりの数の関数が存在する可能性があります)をロードし、セッション全体でそれらを保持すると、RAMスペースの無駄になります。プレミアム。

主な進歩:

DLLの開発はコンピューティングにおける大きな進歩でした。なぜなら、DLLが利用可能になる前は、プログラムに関するすべてのこと(これまで使用されることはほとんどなかった機能を含む)は、プログラムが最初に読み込まれたときにRAMに読み込まれる必要があったからです。そのため、さまざまなプログラムで速度が遅くなり、コンピューティングが非常に非効率になりました。また、RAMに負担がかかるため、いくつかの単純なプログラムを実行するだけでマルチタスクを実行することも非常に困難でした。

考慮事項:

DLLは通常、バージョン固有です。たとえば、プログラムのバージョン1(または場合によってはプログラミング言語)でうまく機能するものは、バージョン2ではうまく機能しない可能性があります。一般的に、古いバージョンのDLLは機能しない傾向があります。新しいバージョンでは十分ですが、新しいバージョンのプログラムは通常、古いバージョンのプログラムまたはプログラミング言語で非常にうまく機能します。


7

動的にリンクされたライブラリ。

例をあげると、アプリケーションに他の誰かのDLLがロードされている場合、そこからプログラミングのビットを使用できます。

常に「5」などで始まる乱数を生成するDLLをロードできます。

プログラムでCrazyDLL.GenerateRandomNumbersSorta()を呼び出すと、番号が返されます。

実際の例として、4つのテキストボックスを組み合わせたDLL(これらを使用してIPアドレスを入力します)があり、自動的に256未満の数値のみを受け入れ、Backspaceキーを押すと前のテキストボックスにジャンプします。

そのコードを使用してDLLを作成しました。今やらなければならないことは、そのすべてのコードを何度も複製することなく、これらのIPアドレステキストボックスコレクションをドラッグアンドドロップすることだけです。

同じDLLには、IPアドレスを16進数の文字列に変換する機能や、その他の便利なコードもあります。



1

DLL =ダイナミックロードリンクライブラリ。あなたが言ったように、それは基本的に関数、C ++クラス、および/またはグローバル変数のコレクションです。DLLは静的にロードする(つまり、プログラムの起動時にOSが自動的にロードする)か、動的に(プログラムが明示的にロードする)ことができます。

main()関数を作成する必要はありませんが、EXEの作成と同じです。EXEではなくDLLを作成するようにリンカーに指示するリンカーディレクティブがあります。

これを行う主な理由は、コードを1つの場所にカプセル化して、コードをそれぞれにリンクするのではなく、複数のexeから使用するためです。

多少歴史的な理由は、コードの一部が物理的に別のファイルに配置されているため、exeが小さくなる可能性があることです。これは、exeがメモリ内で占有するスペースの量が少なくなることを意味します。最近のシステムでは、これは以前ほど問題ではありませんが、Windows Mobileではまだ問題である可能性があります。

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