12

私は実際にどのように機能するかを理解するのが好きDllImportです。平易な英語の説明が必要です - 簡単な説明を意味します。

「インクルード ファイル」ディレクティブ/スタティック ライブラリのように、DLL からエクスポートされたメソッドと静的にリンクしますか?

それとも、C# プログラムの実行ポイントに到達したときに、DLL からメソッドを動的に呼び出しますか?

4

3 に答える 3

25

2 つのコア winapi 関数を使用します。1 つ目は、DLL をプロセスにロードする winapi 関数である LoadLibrary() です。DLL に指定した名前が使用されます。2 つ目は GetProcAddress() で、DLL 内の関数のアドレスを返す winapi 関数です。指定した関数の名前を使用します。次に、指定した引数を使用して関数呼び出し用のスタック フレームを構築するいくつかの配管実行が実行され、見つかったアドレスで関数が呼び出されます。

そうです、これは非常にダイナミックです。これは、ピンボークされた関数を呼び出すステートメントにコードが実際に到達するまで発生しません。この技術用語は、ネイティブ コードの Windows ローダーで使用されるより一般的な早期バインディングとは対照的に、"遅延バインディング" です。

于 2013-01-23T02:56:37.210 に答える
7

動的に呼び出します。DLLimport は、コンパイルされたプログラムに何も埋め込みません。そのため、DLLImport を使用するときは、エンド ユーザーが正しい DLL を正しい場所に持っていることを確認することが重要です。そうしないと、プログラムが動作しません。

于 2013-01-23T02:43:33.217 に答える
2

後者-存在しないdll名を指定することで、それを確信できます。もちろん、コンパイルして実行することはできますが、関数を呼び出すことはできません。

于 2013-01-23T02:43:14.607 に答える