• 検索結果がありません。

構造体を使用する場合の注意点

ドキュメント内 Microsoft Visual Studio .NET移行ガイド (ページ 102-105)

第 3 章  Visual C# .NET への移行 66

4.3  その他の注意事項と追加情報

4.3.3  構造体を使用する場合の注意点

弊社ソフトウェアライブラリの中には、構造体を引数パラメータとして要求する 関数が多くありますので、構造体を使用するDLL関数の呼び出し方法についての 注意点をもう少し詳しく説明します。

プラットフォーム呼び出しを使って構造体のメンバを渡す場合は、型を元のレイ アウトや配置を維持したままフォーマットするための追加情報を提供する必要が あります。

フォーマットされた型を定義するために使用する StructLayoutAttribute クラスに ついて説明します。マネージ コードでは、フォーマットされる型は構造体または クラスのメンバで、メンバに対して予測可能なレイアウト情報を提供するために StructLayoutAttribute によって注釈が付けられます。

フォーマットされる型のメンバ レイアウトは、Automatic、Sequential、または

Explicit として定義できます。各レイアウトオプションの説明を次の表に示します。

表 4-2 レイアウトオプション説明

レイアウト オプション 説明

LayoutKind.Automatic ランタイムが型のメンバを再順序付けできるようす

るオプションです。プラットフォーム呼び出しでは使 用しません。

LayoutKind.Explicit 各フィールドに適用された FieldOffset 属性に従って

型のメンバを順序付けします。

LayoutKind.Sequential 型のメンバをマネージ型定義での順序に従ってアン

マネージ メモリに順序付けします。

これらの属性に関するリファレンス情報については、MSDNライブラリの

「StructLayoutAttribute クラス」および「FieldOffsetAttribute クラス」を参照して

それでは、StructLayoutAttributeクラスを使用した構造体メンバの受け渡し例を示 します。

マネージ コードで MYSTRUC型を定義し、これらの型を MyLib.dll ファイル内 の MyFunc関数に引数として渡す方法の例を次に示します。

typedef struct _myStruc { int a;

int b;

}MYSTRUC;

BOOL MyFunc(MYSTRUC *lpMystc);

この関数は MYSTRUC型へのポインタを期待しているため、構造体は参照渡しす る必要があることに注意してください。

[Visual Basic]

List 4-7 構造体受け渡し例 Visual Basic .NET Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential)> Public Structure MyStruc Public a As Integer

Public b As Integer End Structure

Class MyAPI

Declare Auto Function MyFunc Lib " MyLib.dll" _

(ByRef lpMystc As MYSTRUC) As Boolean End Class

MyStrucにLayoutKind.Explicitを使用する場合は次のように宣言します。

List 4-8 構造体受け渡し例Explicitオプション Visual Basic .NET

<StructLayout(LayoutKind.Explicit)> Public Structure MyStruc

[C#]

List 4-9 構造体受け渡し例 Visual C# .NET using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]

public struct MYSTRUC { public int a;

public int b;

}

class MyAPI {

[DllImport("MyLib.dll")]

public static extern Bool PtInRect(ref MYSTRUC lpMystc);

}

MyStrucにLayoutKind.Explicitを使用する場合は次のように宣言します。

List 4-10 構造体受け渡し例 Explicit オプションVisual C# .NET [StructLayout(LayoutKind. Explicit)]

public struct MYSTRUC { [FieldOffset(0)] public int a;

[FieldOffset(4)] public int b;

}

ドキュメント内 Microsoft Visual Studio .NET移行ガイド (ページ 102-105)