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

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

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

メモメモ

文字列を割り当てる 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 宣言に適用するには、DllImportAttribute 属性を Declare ステートメントの代わりに使用する必要があります。

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 関数の呼び出し