アンマネージ DLL 関数の処理Consuming Unmanaged DLL Functions

プラットフォーム呼び出しは、マネージド コードがダイナミック リンク ライブラリ (DLL) に実装されたアンマネージド関数 (Windows API に含まれているものなど) を呼び出すことを可能にするサービスです。Platform invoke is a service that enables managed code to call unmanaged functions implemented in dynamic link libraries (DLLs), such as those in the Windows API. これはエクスポートされた関数を見つけて呼び出し、必要に応じて相互運用の境界を越えて、その引数 (整数、文字列、配列、構造体、その他) をマーシャリングします。It locates and invokes an exported function and marshals its arguments (integers, strings, arrays, structures, and so on) across the interoperation boundary as needed.

このセクションでは、アンマネージド DLL 関数の使用に関連するタスクを紹介し、プラットフォーム呼び出しについての詳しい情報を提供します。This section introduces tasks associated with consuming unmanaged DLL functions and provides more information about platform invoke. 以下のタスクに加えて、一般的な考慮事項、および追加情報や例を提供するリンクがあります。In addition to the following tasks, there are general considerations and a link providing additional information and examples.

エクスポートされた DLL 関数を使用するにはTo consume exported DLL functions

  1. DLL 内の関数を識別しますIdentify functions in DLLs.

    少なくとも、関数の名前とそれを含んでいる DLL の名前を指定する必要があります。Minimally, you must specify the name of the function and name of the DLL that contains it.

  2. DLL 関数を保持するクラスを作成しますCreate a class to hold DLL functions.

    既存のクラスを使用して、アンマネージ関数ごとに個別のクラスを作成するか、または関連するアンマネージ関数のセットを格納する 1 つのクラスを作成できます。You can use an existing class, create an individual class for each unmanaged function, or create one class that contains a set of related unmanaged functions.

  3. マネージド コードでプロトタイプを作成しますCreate prototypes in managed code.

    [Visual Basic] Declare ステートメントを Function および Lib キーワードと共に使用します。[Visual Basic] Use the Declare statement with the Function and Lib keywords. いくつかのまれなケースでは、DllImportAttributeShared Function キーワードと共に使用できます。In some rare cases, you can use the DllImportAttribute with the Shared Function keywords. それらのケースについては、このセクションで後述します。These cases are explained later in this section.

    [C#] DllImportAttribute を使用して DLL と関数を指定します。[C#] Use the DllImportAttribute to identify the DLL and function. メソッドを static および extern 修飾子でマークします。Mark the method with the static and extern modifiers.

    [C++] DllImportAttribute を使用して DLL と関数を指定します。[C++] Use the DllImportAttribute to identify the DLL and function. ラッパー メソッドまたは関数を extern "C" でマークします。Mark the wrapper method or function with extern "C".

  4. DLL 関数を呼び出しますCall a DLL function.

    他のマネージド メソッドと同様の方法で、マネージド クラスのメソッドを呼び出します。Call the method on your managed class as you would any other managed method. 構造体の受け渡しおよびコールバック関数の実装は、特殊なケースです。Passing structures and implementing callback functions are special cases.

プラットフォーム呼び出しで使用する .NET ベースの宣言を作成する方法を示す例については、「プラットフォーム呼び出しによるデータのマーシャリング」を参照してください。For examples that demonstrate how to construct .NET-based declarations to be used with platform invoke, see Marshaling Data with Platform Invoke.

プラットフォーム呼び出しの詳細A closer look at platform invoke

プラットフォーム呼び出しは、エクスポート関数を検索して、その引数を実行時にマーシャリングするために、メタデータに依存します。Platform invoke relies on metadata to locate exported functions and marshal their arguments at run time. 次に、このプロセスの図を示します。The following illustration shows this process.

プラットフォーム呼び出しを示す図。

プラットフォーム呼び出しがアンマネージ関数を呼び出すと、以下の一連のアクションが実行されます。When platform invoke calls an unmanaged function, it performs the following sequence of actions:

  1. 関数を含む DLL を検索します。Locates the DLL containing the function.

  2. DLL をメモリに読み込みます。Loads the DLL into memory.

  3. メモリ内の関数のアドレスを検索し、その引数をスタックにプッシュし、必要に応じてデータをマーシャリングします。Locates the address of the function in memory and pushes its arguments onto the stack, marshaling data as required.

    注意

    DLL の検索と読み込み、およびメモリ内の関数のアドレスの検索は、その関数を初めて呼び出したときにのみ生じます。Locating and loading the DLL, and locating the address of the function in memory occur only on the first call to the function.

  4. アンマネージ関数に制御を移します。Transfers control to the unmanaged function.

プラットフォーム呼び出しは、アンマネージド 関数によって生成された例外を、マネージド呼び出し元にスローします。Platform invoke throws exceptions generated by the unmanaged function to the managed caller.

関連項目See also