DLLには何が含まれ、どのように機能しますか?


87

私は常にC#コードでDLLを参照していますが、それらはまだ謎のままであり、明確にしておきたいと思います。これは、DLLに関する質問の一種の頭脳ダンプです。

DLLは動的にリンクされたライブラリであると理解しています。つまり、別のプログラムが実行時にこのライブラリにアクセスして「機能」を取得できます。ただし、Web.dllBusiness.dllWeb.dllはフロントエンド機能でありBusiness.dll、タイプとメソッドを参照する)を含む次のASP.NETプロジェクトを検討してください。

  1. どの時点でWeb.dll動的にリンクしBusiness.dllますか?Word(など)を使用しているときに、一見小さなタスクのためにWindows HDDがスラッシングしていることに気づきましたが、Wordがオフになり、他のDLLの機能に動的にリンクしていると思いますか?

    1a。さらに、DLLをロードしてリンクするものは何ですか?OSまたは.NETフレームワークなどのランタイムフレームワークですか?

    1b。「リンク」のプロセスは何ですか?互換性チェックは行われますか?同じメモリにロードしますか?リンクは実際にはどういう意味ですか?

  2. DLL内のコードを実際に実行するものは何ですか?プロセッサによって実行されますか、それともプロセッサがDLL内のコードを理解する前に、変換またはコンパイルの別の段階がありますか?

    2a。C#.NETに組み込まれているDLLの場合、これを実行しているのは何ですか:.NETフレームワークまたはオペレーティングシステムを直接使用していますか?

  3. LinuxのDLLはWindowsシステムで動作しますか(そのようなものが存在する場合)、それともオペレーティングシステム固有ですか?

  4. DLLは特定のフレームワークに固有ですか?C#.NETを使用して構築されたDLLは、たとえばBorland C ++で構築されたDLLで使用できますか?

    4a。4の答えが「いいえ」の場合、DLLのポイントは何ですか?さまざまなフレームワークがリンクされたファイルに独自の形式を使用しないのはなぜですか?例:.NETに組み込まれている.exeは、.abcのファイルタイプがコードにリンクできるものであることを認識しています。

  5. Web.dll/のBusiness.dll例に戻ると、参照する必要のある顧客のクラスタイプを取得Business.dllWeb.dllます。これはBusiness.dll、顧客クラスが実際に何であるかに関するある種の仕様が含まれていることを意味する必要があります。たとえば、Business.dllファイルをDelphiでコンパイルした場合、C#はそれを理解して顧客クラスを作成できますか、または「申し訳ありませんが、別のDelphi DLLからのみ使用できます」というヘッダー情報などがありますか? ?

    5a。同じことがメソッドにも当てはまります。CreateInvoice()DLLにメソッドを記述し、それをC ++でコンパイルしてから、C#からアクセスして実行できますか?何が私にこれをやめさせるか、または許しますか?

  6. DLLハイジャックに関しては、置換(不良)DLLには、ハイジャックされているものとまったく同じメソッドシグネチャとタイプが含まれている必要があります。元のDLLで使用可能なメソッドを見つけることができれば、これを行うのは難しいことではないと思います。

    6a。別のDLLにアクセスできるかどうかをC#プログラムで決定しているのは何ですか?ハイジャックされたDLLに元のDLLとまったく同じメソッドとタイプが含まれていても、別の言語でコンパイルされている場合、それは機能しますか?

DLLのインポートとDLLの登録とは何ですか?


21
この質問は、SOの歴史の中で最も長い答えを求めているのかもしれません。
Matti Virkkunen 2010

4
それは12の別々の質問でなければなりませんでした。
ヘンクホルターマン2010

2
これは素晴らしい質問ですが、私は@Chaosと@Mattiに本当に同意します。この質問にはもっと焦点を当てる必要があり、いくつかの異なる質問に分割することができます/すべきです。
クリス・トンプソン

3
私がそれを書いたとき、それは少し
頭の痛いものでし

1
今ではコミュニティウィキになっているはずです。
leppie 2013

回答:


74

まず、2つの非常に異なる種類のDLLの違いを理解する必要があります。Microsoftは、.NET(マネージコード)とネイティブコードの両方で同じファイル拡張子(.exeと.dll)を使用することを決定しましたが、マネージコードDLLとネイティブDLLは内部で大きく異なります。

1)web.dllはどの時点でbusiness.dllに動的にリンクしますか?Wordなどを使用しているときに一見小さなタスクのためにWindowsHDDがスラッシングしていることに気づきましたが、このWordがオフになり、他のDLLの機能に動的にリンクしていると思いますか?

1).NETの場合、DLLは通常、DLLから何かにアクセスしようとする最初のメソッドが実行されるときに、オンデマンドでロードされます。これが、DLLをロードできない場合に、コード内のどこでもTypeNotFoundExceptionsを取得できる理由です。Wordのようなものが突然HDDに頻繁にアクセスし始めると、スワップしている可能性があります(RAMに空きを作るためにディスクにスワップアウトされたデータを取得します)

1a)さらに、DLLをロードしてリンクするものは何ですか?O / Sまたは.Netフレームワークなどのランタイムフレームワークですか?

1a)マネージDLLの場合、ロードされるのは.NETフレームワークであり、JITはコンパイル(.NETバイトコードをネイティブコードにコンパイル)し、DLLをリンクします。ネイティブDLLの場合、DLLをロードしてリンクするのはオペレーティングシステムのコンポーネントです(ネイティブDLLにはすでにネイティブコードが含まれているため、コンパイルは必要ありません)。

1b)「リンク」のプロセスは何ですか?互換性があることを確認していますか?同じメモリにロードしますか?リンクは実際にはどういう意味ですか?

1b)リンクとは、呼び出しコード内のDLL内のシンボル(メソッドなど)への参照(メソッド呼び出しなど)が、DLL内のものの実際のアドレスに置き換えられる場合です。DLLがメモリにロードされる前に、DLL内のものの最終的なアドレスを知ることができないため、これが必要です。

2)DLL内のコードを実際に実行するものは何ですか?プロセッサによって実行されますか、それともプロセッサがDLL内のコードを理解する前に、変換またはコンパイルの別の段階がありますか?

2)Windowsでは、.exeファイルと.dllファイルはまったく同じです。ネイティブの.exeファイルと.dllファイルにはネイティブコード(プロセッサが実行するものと同じもの)が含まれているため、翻訳する必要はありません。管理対象の.exeファイルと.dllファイルには、最初にJITコンパイルされた(ネイティブコードに変換された).NETバイトコードが含まれています。

2a)C#.netから構築されたDLLの場合、これを実行しているのは何ですか?.Netフレームワークまたはオペレーティングシステムを直接?

2a)コードがJITコンパイルされた後、他のコードとまったく同じ方法で実行されます。

3)LinuxのDLLはWindowsシステムで動作しますか(そのようなものが存在する場合)、それともオペレーティングシステム固有ですか?

3)両方のプラットフォームのフレームワークが最新であり、DLLを作成した人がネイティブ呼び出しを使用して互換性を故意に壊さない限り、マネージDLLはそのまま機能する可能性があります。ネイティブDLLは、形式が異なるため、そのままでは機能しません(内部のマシンコードが同じであっても、両方が同じプロセッサプラットフォーム用である場合)。ちなみに、Linuxでは「DLL」は.so(共有オブジェクト)ファイルと呼ばれています。

4)それらは特定のフレームワークに固有ですか?C#.Netを使用して構築されたDLLは、Borland C ++で構築されたDLLで使用できますか(例のみ)?

4)マネージDLLは.NET Frameworkに固有ですが、当然、互換性のある任意の言語で動作します。ネイティブDLLは、全員が同じ規則(呼び出し規則(マシンコードレベルで関数の引数が渡される方法)、シンボルの命名など)を使用している限り互換性があります。

5)web.dll /business.dllの例に戻ります。クラスタイプの顧客を取得するには、web.dllからbusiness.dllを参照する必要があります。これは、business.dllに顧客クラスが実際に何であるかのある種の仕様が含まれていることを意味する必要があります。DelphiがC#でそれを理解し、顧客クラスを作成できると言ってbusiness.dllファイルをコンパイルした場合、または「申し訳ありませんが、別のdelphidllからのみ使用できます」というヘッダー情報などがあります。 。

5)マネージDLLには、含まれるすべてのクラス、メソッド、フィールドなどの完全な説明が含まれています。AFAIK Delphiは.NETをサポートしていないため、ネイティブDLLを作成しますが、これは.NETで直接使用することはできません。PInvokeを使用して関数を呼び出すことはおそらく可能ですが、クラス定義は見つかりません。私はDelphiを使用していないので、DLLで型情報を格納する方法がわかりません。たとえば、C ++は、型宣言を含むヘッダー(.h)ファイルに依存しており、DLLとともに配布する必要があります。

6)DLLハイジャックに関しては、置換(不良)DLLには、ハイジャックされているものとまったく同じメソッドシグネチャ、タイプが含まれている必要があります。元のDLLで使用可能なメソッドなどを見つけることができれば、これを行うのは難しいことではないと思います。

6)確かに、DLLを簡単に切り替えることができれば、それは難しいことではありません。これを回避するには、コード署名を使用できます。誰かが署名されたDLLを置き換えるためには、秘密にされていた署名キーを知っている必要があります。

6a)ここで少し繰り返し質問がありますが、これは私のC#プログラムで別のDLLにアクセスできるかどうかを決定していることに戻りますか?ハイジャックされたDLLに元のDLLとまったく同じメソッドとタイプが含まれていても、別の言語でコンパイルされた場合、それは機能しますか?

6a)任意の.NET言語で作成されたマネージDLLである限り機能します。

  • DLLのインポートとは何ですか?およびdll登録?

「DLLのインポート」は多くのことを意味します。通常、DLLファイルを参照してその中の物を使用することを意味します。

DLL登録は、Windowsで行われるもので、DLLファイルをCOMコンポーネントとしてグローバルに登録し、システム上のすべてのソフトウェアで使用できるようにします。


3
#4に、.NETがDLLを変換できるため、COM(Common Object Model)を理解/使用するネイティブプログラムと互換性があることを追加します。非常に良い答えです。
merickOWA 2010

7

.dllファイルには、アプリケーションで使用できるコンパイル済みコードが含まれています。

.dllのコンパイルに使用されるツールが重要な場合もあれば、そうでない場合もあります。プロジェクトで.dllを参照できる場合は、.dllの公開関数のコーディングにどのツールを使用したかは関係ありません。

コンパイル時にリンクするクラスなどの静的にリンクされたライブラリとは異なり、リンクは実行時に行われます。

.dllは、自分で作成したくないアプリケーションに必要なものを提供するブラックボックスと考えることができます。はい、.dllの署名を理解している誰かが、その中に異なるコードを含む別の.dllファイルを作成する可能性があり、呼び出し元のアプリケーションはその違いを知ることができませんでした。

HTH


6

1)web.dllはどの時点でbusiness.dllに動的にリンクしますか?Wordなどを使用しているときに一見小さなタスクのためにWindowsHDDがスラッシングしていることに気づきましたが、このWordがオフになり、他のDLLの機能に動的にリンクしていると思いますか?

1)リンクと読み込みを混同していると思います。リンクは、すべてのチェックとバランスがテストされ、要求されたものが利用可能であることを確認するときです。ロード時に、dllの一部がメモリにロードされるか、ページファイルにスワップアウトされます。これはあなたが見ているHDアクティビティです。

動的リンクは静的リンクとは異なり、静的リンクでは、すべてのオブジェクトコードがリンク時にメインの.exeに配置されます。ダイナミックリンクを使用すると、オブジェクトコードは別のファイル(dll)に配置され、.exeとは異なる時間にロードされます。

ダイナミックリンクは、暗黙的(つまり、アプリがインポートライブラリとリンクする)または明示的(つまり、アプリがLoadLibrary(ex)を使用してdllをロードする)にすることができます。

暗黙の場合、/ DELAYLOADを使用して、アプリが実際に必要になるまでdllの読み込みを延期できます。それ以外の場合は、プロセス開始の一部として、その少なくとも一部がロードされます(プロセスアドレス空間にマップされます)。dllは、プロセスがアクティブな間はアンロードしないように要求することもできます。

COMは、LoadLibraryを使用してCOMdllをロードします。暗黙の場合でも、システムはLoadLibraryと同様のものを使用して、プロセスの起動時または最初の使用時にdllをロードしていることに注意してください。

2)DLL内のコードを実際に実行するものは何ですか?プロセッサによって実行されますか、それともプロセッサがDLL内のコードを理解する前に、変換またはコンパイルの別の段階がありますか?

2)DLLには、.exeと同じようにオブジェクトコードが含まれています。dllファイルの形式はexeファイルの形式とほぼ同じです。2つのファイルのヘッダーが異なるのは1ビットだけだと聞きました。

C#.netから構築されたDLLの場合、.Netフレームワークがそれを実行しています。

3)LinuxのDLLはWindowsシステムで動作しますか(そのようなものが存在する場合)、それともオペレーティングシステム固有ですか?

3)DLLはプラットフォーム固有です。

4)それらは特定のフレームワークに固有ですか?C#.Netを使用して構築されたDLLは、Borland C ++で構築されたDLLで使用できますか(例のみ)?

4)特別な注意が払われたり、追加のグルーコードが記述されたりすると、DLLは他のフレームワークと相互運用できます。

DLLは、会社が重複する機能を持つ複数の製品を販売する場合に非常に役立ちます。たとえば、会社の30を超えるさまざまな製品で使用されているラスターI / Odllを管理しています。複数の製品がインストールされている場合、dllを1回アップグレードすると、すべての製品を新しいラスター形式にアップグレードできます。

5)web.dll /business.dllの例に戻ります。クラスタイプの顧客を取得するには、web.dllからbusiness.dllを参照する必要があります。これは、business.dllに顧客クラスが実際に何であるかのある種の仕様が含まれていることを意味する必要があります。DelphiがC#でそれを理解し、顧客クラスを作成できると言ってbusiness.dllファイルをコンパイルした場合、または「申し訳ありませんが、別のdelphidllからのみ使用できます」というヘッダー情報などがあります。 。

5)プラットフォームに応じて、dllの機能は、.hファイル、.tlbファイル、または.net上のその他の方法でさまざまな方法で表示されます。

6)DLLハイジャックに関しては、置換(不良)DLLには、ハイジャックされているものとまったく同じメソッドシグネチャ、タイプが含まれている必要があります。元のDLLで使用可能なメソッドなどを見つけることができれば、これを行うのは難しいことではないと思います。

6)dumpbin / exportsとdumbin / importsは、.exeと.dllで使用する興味深いツールです。


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