マネージ コードでのプロトタイプの作成
このトピックでは、アンマネージ関数にアクセスする方法を説明し、マネージ コードでメソッド定義に注釈を付けるいくつかの属性フィールドを紹介します。 プラットフォーム呼び出しと共に使用する .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
BestFitMapping、CallingConvention、ExactSpelling、PreserveSig、SetLastError、ThrowOnUnmappableChar の各フィールドを 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 関数を定義する方法に関する情報へのリンクが含まれています。
フィールド |
説明 |
---|---|
最適マッピングを有効または無効にします。 |
|
メソッドに引数を渡すときに使われる呼び出し規約を指定します。 既定値は WinAPI です。この値は、Intel ベースの 32 ビット プラットフォームの __stdcall に対応します。 |
|
名前変形の処理と、関数の文字列引数のマーシャリング方法を制御します。 既定値は、CharSet.Ansi です。 |
|
呼び出される DLL エントリ ポイントを指定します。 |
|
エントリ ポイントを文字セットに合わせて変更するかどうかを制御します。 既定値はプログラミング言語によって異なります。 |
|
マネージ メソッド シグネチャが、HRESULT を返し、戻り値に [out, retval] 引数を追加するアンマネージ シグネチャに変換されるかどうかを制御します。 既定値は true (シグネチャの変換抑止) です。 |
|
呼び出し元が Marshal.GetLastWin32Error API 関数を使用して、メソッドの実行中にエラーが発生したかどうかを判別できるようにします。 Visual Basic の場合、既定値は true です。C# および C++ の場合、既定値は false です。 |
|
ANSI の "?" 文字に変換される対応付けができない Unicode 文字に関する例外のスローを制御します。 |
詳細なリファレンス情報については、「DllImportAttribute クラス」を参照してください。