マネージ コードでのプロトタイプの作成

このトピックでは、アンマネージ関数にアクセスする方法を説明し、マネージ コードでメソッド定義に注釈を付けるいくつかの属性フィールドを紹介します。プラットフォーム呼び出しと共に使用する .NET ベースの宣言を構築する方法を示す例については、「プラットフォーム呼び出しによるデータのマーシャリング」を参照してください。

マネージ コードからアンマネージ DLL 関数にアクセスするには、関数の名前と、その関数をエクスポートする DLL の名前を知っておく必要があります。この情報を入手したら、DLL に実装されているアンマネージ関数に対するマネージ定義の作成を開始できます。さらに、プラットフォーム呼び出しで関数を生成する方法や、その関数との間でデータを受け渡しするときのマーシャリングの方法を調整できます。

Noteメモ :

文字列を割り当てる Win32 API 関数では、LocalFree などのメソッドを使うことで、文字列を解放できます。プラットフォーム呼び出しは、このようなパラメータを異なる方法で処理します。プラットフォーム呼び出しを行う場合は、パラメータを String 型ではなく、IntPtr 型にします。型を手動で文字列に変換し、この型を手動で解放するには、System.Runtime.InteropServices.Marshal クラスが提供するメソッドを使用します。

宣言の基本

アンマネージ関数に対するマネージ定義は言語に依存します。その例を次に示します。すべての言語を表示するには、このページの左上隅にある [言語のフィルタ] ボタンをクリックしてください。より完全なコード例については、「プラットフォーム呼び出しの例」を参照してください。

Imports System.Runtime.InteropServices
Public Class Win32
    Declare Auto Function MessageBox Lib "user32.dll" _
       (ByVal hWnd As Integer, _
        ByVal txt As String, ByVal caption As String, _
        ByVal Typ As Integer) As IntPtr
End Class

BestFitMappingCallingConventionExactSpellingPreserveSigSetLastErrorThrowOnUnmappableChar の各フィールドを Microsoft Visual Basic 2005 の宣言に適用するには、Declare ステートメントの代わりに DllImportAttribute 属性を使用する必要があります。

Imports System.Runtime.InteropServices
Public Class Win32
   <DllImport ("user32.dll", CharSet := CharSet.Auto)> _
   Public Shared Function MessageBox (ByVal hWnd As Integer, _
        ByVal txt As String, ByVal caption As String, _
        ByVal Typ As Integer) As IntPtr
   End Function
End Class
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
    public static extern IntPtr MessageBox(int hWnd, String text, 
                                       String caption, uint type);
using namespace System::Runtime::InteropServices;
[DllImport("user32.dll")]
    extern "C" IntPtr MessageBox(int hWnd, String* pText, String* pCaption,
                              unsigned int uType);

定義の調整

属性フィールドは、明示的に設定するかどうかにかかわらず、マネージ コードの動作を定義します。プラットフォーム呼び出しは、アセンブリ内にメタデータとして存在する各種のフィールドに設定された既定値に従って動作します。この既定の動作を変更するには、1 つ以上のフィールドの値を調整します。多くの場合、値を設定するには DllImportAttribute を使用します。

プラットフォーム呼び出しに関係するすべての属性フィールドのリストを次の表に示します。この表には、各フィールドの既定値と、これらのフィールドを使ってアンマネージ DLL 関数を定義する方法に関する情報へのリンクが含まれています。

フィールド 説明

BestFitMapping

最適マッピングをオフにします。

CallingConvention

メソッドに引数を渡すときに使われる呼び出し規約を指定します。既定値は WinAPI です。この値は Intel ベースの 32 ビット プラットフォームの __stdcall に対応します。

CharSet

名前変形の処理と、関数の文字列引数のマーシャリング方法を制御します。既定値は CharSet.Ansi です。

EntryPoint

呼び出される DLL エントリ ポイントを指定します。

ExactSpelling

エントリ ポイントを文字セットに合わせて変更するかどうかを制御します。既定値はプログラミング言語によって異なります。

PreserveSig

マネージ メソッド シグネチャが、HRESULT を返し、戻り値に [out, retval] 引数を追加するアンマネージ シグネチャに変換されるかどうかを制御します。

既定値は true (シグネチャの変換抑止) です。

SetLastError

呼び出し元が Marshal.GetLastWin32Error API 関数を使って、メソッドの実行中にエラーが発生したかどうかを判断できるようにします。Visual Basic の場合、既定値は true です。C# および C++ の場合、既定値は false です。

ThrowOnUnmappableChar

ANSI の '?' 文字に変換される対応付けができない Unicode 文字に関する例外のスローを制御します。

詳細なリファレンス情報については、「DllImportAttribute クラス」を参照してください。

参照

概念

アンマネージ DLL 関数の処理
エントリ ポイントの指定
文字セットの指定
プラットフォーム呼び出しの例
DLL 内の関数の識別
DLL 関数を保持するクラスの作成

その他の技術情報

DLL 関数の呼び出し