web-dev-qa-db-ja.com

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

私はC#コードでDLLを常に参照していますが、それらは明らかにしたいミステリーのままです。これは、DLLに関する質問の一種のブレインダンプです。

DLLは動的にリンクされたライブラリであり、別のプログラムが実行時にこのライブラリにアクセスして「機能」を取得できることを意味します。ただし、_Web.dll_および_Business.dll_(_Web.dll_はフロントエンド機能であり、タイプおよびメソッドについては_Business.dll_を参照します)。

  1. _Web.dll_はどの時点で_Business.dll_に動的にリンクしますか? Windows HDDで、Word(など)を使用しているときに一見小さなタスクでスラッシングが発生していることに気づきました。Wordは他のDLLの機能に動的にリンクしていると思いますか。

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

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

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

    2a。 DLL C#.NETに組み込まれている場合、これを実行しているのは.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.dll_から_Web.dll_を参照する必要があります。これは_Business.dll_が顧客クラスが実際に何であるかに関するある種の仕様を含むことを意味しなければなりません。 _Business.dll_ファイルをDelphiでコンパイルしていた場合、C#がそれを理解し、顧客クラスを作成できるか、何らかのヘッダー情報または「ごめんなさい、私しか使えない別のDelphi DLLから」?

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

  6. DLL=ハイジャックの問題については、置換(不良)DLLは、ハイジャックされているものとして正確なメソッドシグネチャとタイプを含んでいる必要があります。元のDLLでどのメソッドが利用可能かを知ることができれば、これは難しくありません。

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

DLLインポートおよびDLL登録?

76
Remotec

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

1)web.dllはどの時点でbusiness.dllに動的にリンクしますか? Windows HDDで、Wordなどを使用しているときに一見小さなタスクでスラッシングが発生していることに気づきました。この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にあるものの最終的なアドレスは、メモリにロードされる前に知ることができないため、これが必要です。

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

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

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

6)DLLハイジャックの件名で、置換(不良)DLLには正確なメソッドシグネチャが含まれている必要があり、ハイジャックされているものとして入力します。元のDLLでどのメソッドなどが利用可能かを知ることができれば、これは難しいことではないと思います。

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

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

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

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

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

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

66
Matti Virkkunen

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

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

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

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

HTH

7
Beth

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

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

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

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

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

COMはLoadLibraryを使用してCOM dllをロードします。暗黙的な場合でも、システムは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/O DLLを管理しています。複数の製品がインストールされている場合、dllの1回のアップグレードですべての製品を新しいラスター形式にアップグレードできます。

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

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

6)DLLハイジャックの件名で、置換(不良)DLLには正確なメソッドシグネチャが含まれている必要があり、ハイジャックされているものとして入力します。元のDLLでどのメソッドなどが利用可能かを知ることができれば、これは難しいことではないと思います。

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

5
edgman