次の方法で共有


Marshal.StructureToPtr メソッド

マネージ オブジェクトからアンマネージ メモリ ブロックにデータをマーシャリングします。

Public Shared Sub StructureToPtr( _
   ByVal structure As Object, _   ByVal ptr As IntPtr, _   ByVal fDeleteOld As Boolean _)
[C#]
public static void StructureToPtr(objectstructure,IntPtrptr,boolfDeleteOld);
[C++]
public: static void StructureToPtr(Object* structure,IntPtrptr,boolfDeleteOld);
[JScript]
public static function StructureToPtr(
   structure : Object,ptr : IntPtr,fDeleteOld : Boolean);

パラメータ

  • structure
    マーシャリングするデータを保持しているマネージ オブジェクト。このオブジェクトは、書式指定クラスのインスタンスである必要があります。
  • ptr
    このメソッドを呼び出す前に割り当てる必要があるアンマネージ メモリ ブロックへのポインタ。
  • fDeleteOld
    このメソッドの実行前に、 ptr パラメータに対して Marshal.DestroyStructure メソッドを呼び出す場合は truefalse を渡すと、メモリ リークが生じる場合があります。

解説

StructureToPtr は、 ptr パラメータが指す、事前に割り当てられたメモリ ブロックに構造体の内容をコピーします。 fDeleteOld パラメータが true の場合、 ptr が最初に指していたバッファは、埋め込みポインタに対する適切な削除 API を呼び出すことによって削除されます。このメソッドは、反映されたマネージ クラスで指定されたすべての参照フィールドをクリーンアップします。

アンマネージ メモリ ブロックが ptr によって指定されるとします。このブロックのレイアウトは、対応するマネージ クラス structure によって記述されます。 StructureToPtr は、構造体からポインタにフィールド値をマーシャリングします。 ptr ブロックが参照フィールドを含み、現在 "abc" を保持する文字列バッファを指しているとします。マネージ側の対応するフィールドは、"vwxyz" を保持する文字列であるとします。特に何も指定しない場合は、 StructureToPtr が "vwxyz" を保持する新しいアンマネージ バッファを割り当て、 ptr ブロックにフックします。これにより、"abc" を保持している古いバッファは、解放されてアンマネージ ヒープに戻されることなく、宙に浮きます。最終的には、コード内のメモリ リークを表す孤立したバッファとなります。 fDeleteOld パラメータを true に設定した場合、 StructureToPtr は "abc" を保持するバッファを解放してから、"vwxyz" の新しいバッファを割り当てます。

メモ   既存の構造体を固定するには、コピーする代わりに、 System.Runtime.InteropServices.GCHandle 型を使用して、構造体の固定ハンドルを作成します。固定方法の詳細については、「 コピーと固定 」を参照してください。

メモ   このメソッドは SecurityAction.LinkDemand を使用して、信頼関係のないコードからの呼び出しを防ぎます。 SecurityPermissionAttribute.UnmanagedCode アクセス許可は、直前の呼び出し元にのみ要求されます。信頼性が一部しか確認されていないコードから呼び出すことができるコードの場合、ユーザー入力を検証せずに Marshal クラスに渡すことは避けてください。 LinkDemand メンバの使用に関する重要な制約事項については、「 Demand と LinkDemand 」を参照してください。

使用例

[Visual Basic, C#] 次の例に示すように、 StructureToPtr は、同じメモリ位置で、ある構造体を別の構造体とスワップするときに便利です。

 
Dim IntPtr addressOfStructure1 As IntPtr = ...
Dim structure2 As TYPEATTR = ...
Marshal.StructureToPtr(structure2, addressOfStructure1, True)
[C#] 
IntPtr addressOfStructure1 = ...;
TYPEATTR structure2 = ...;
Marshal.StructureToPtr(structure2, addressOfStructure1, true);

[C++, JScript] C++ および JScript のサンプルはありません。Visual Basic および C# のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET

.NET Framework セキュリティ:

参照

Marshal クラス | Marshal メンバ | System.Runtime.InteropServices 名前空間 | DestroyStructure | GCHandle