Marshal.StructureToPtr メソッド

定義

オーバーロード

StructureToPtr(Object, IntPtr, Boolean)
互換性のために残されています。

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

StructureToPtr<T>(T, IntPtr, Boolean)

[.NET Framework 4.5.1 以降のバージョンでサポート]

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

StructureToPtr(Object, IntPtr, Boolean)

注意事項

StructureToPtr(Object, IntPtr, Boolean) may be unavailable in future releases. Instead, use StructureToPtr<T>(T, IntPtr, Boolean). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296516

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

public:
 static void StructureToPtr(System::Object ^ structure, IntPtr ptr, bool fDeleteOld);
[System.Obsolete("StructureToPtr(Object, IntPtr, Boolean) may be unavailable in future releases. Instead, use StructureToPtr<T>(T, IntPtr, Boolean). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296516")]
[System.Security.SecurityCritical]
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
[System.Security.SecurityCritical]
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
[System.Runtime.InteropServices.ComVisible(true)]
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
[<System.Obsolete("StructureToPtr(Object, IntPtr, Boolean) may be unavailable in future releases. Instead, use StructureToPtr<T>(T, IntPtr, Boolean). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296516")>]
[<System.Security.SecurityCritical>]
static member StructureToPtr : obj * nativeint * bool -> unit
static member StructureToPtr : obj * nativeint * bool -> unit
[<System.Security.SecurityCritical>]
static member StructureToPtr : obj * nativeint * bool -> unit
[<System.Runtime.InteropServices.ComVisible(true)>]
static member StructureToPtr : obj * nativeint * bool -> unit
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(true)>]
static member StructureToPtr : obj * nativeint * bool -> unit
Public Shared Sub StructureToPtr (structure As Object, ptr As IntPtr, fDeleteOld As Boolean)

パラメーター

structure
Object

マーシャリングするデータを保持すマネージド オブジェクト。 このオブジェクトは、書式指定クラスの構造体またはインスタンスである必要があります。

ptr
IntPtr

nativeint

このメソッドを呼び出す前に割り当てる必要があるアンマネージ メモリ ブロックへのポインター。

fDeleteOld
Boolean

このメソッドがデータをコピーする前に、ptr パラメーターに対して DestroyStructure(IntPtr, Type) メソッドを呼び出す場合は true。 ブロックには有効なデータを含める必要があります。 メモリ ブロックに既にデータが格納されているときに false を渡すと、メモリ リークが発生する可能性があることに注意してください。

属性

例外

structure は書式指定クラスではない参照型です。

または

structure がジェネリック型のインスタンスです (.NET Framework 4.5 以前のバージョンのみ)

次の例では、マネージド構造体を作成し、そのメソッドを使用してアンマネージ メモリに転送し、メソッドを使用 StructureToPtr してマネージド メモリに PtrToStructure 戻します。

using System;
using System.Runtime.InteropServices;

public struct Point
{
    public int x;
    public int y;
}

class Example
{

    static void Main()
    {

        // Create a point struct.
        Point p;
        p.x = 1;
        p.y = 1;

        Console.WriteLine("The value of first point is " + p.x + " and " + p.y + ".");

        // Initialize unmanged memory to hold the struct.
        IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(p));

        try
        {

            // Copy the struct to unmanaged memory.
            Marshal.StructureToPtr(p, pnt, false);

            // Create another point.
            Point anotherP;

            // Set this Point to the value of the
            // Point in unmanaged memory.
            anotherP = (Point)Marshal.PtrToStructure(pnt, typeof(Point));

            Console.WriteLine("The value of new point is " + anotherP.x + " and " + anotherP.y + ".");
        }
        finally
        {
            // Free the unmanaged memory.
            Marshal.FreeHGlobal(pnt);
        }
    }
}
Imports System.Runtime.InteropServices



Public Structure Point
    Public x As Integer
    Public y As Integer
End Structure


Module Example


    Sub Main()

        ' Create a point struct.
        Dim p As Point
        p.x = 1
        p.y = 1

        Console.WriteLine("The value of first point is " + p.x.ToString + " and " + p.y.ToString + ".")

        ' Initialize unmanged memory to hold the struct.
        Dim pnt As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(p))

        Try

            ' Copy the struct to unmanaged memory.
            Marshal.StructureToPtr(p, pnt, False)

            ' Create another point.
            Dim anotherP As Point

            ' Set this Point to the value of the 
            ' Point in unmanaged memory. 
            anotherP = CType(Marshal.PtrToStructure(pnt, GetType(Point)), Point)

            Console.WriteLine("The value of new point is " + anotherP.x.ToString + " and " + anotherP.y.ToString + ".")

        Finally
            ' Free the unmanaged memory.
            Marshal.FreeHGlobal(pnt)
        End Try

    End Sub
End Module

注釈

値型の場合 structure は、ボックス化またはボックス化解除できます。 ボックス化されている場合は、コピーする前にボックス化解除されます。

書式設定されたクラスは、属性によって StructLayoutAttribute レイアウトが指定されている参照型です 。いずれか LayoutKind.Explicit または LayoutKind.Sequential.

StructureToPtr は、パラメーターが structure 指す事前割り当て済みのメモリ ブロックにコンテンツを ptr コピーします。 COM インターフェイス ポインター (インターフェイス、レイアウトのないクラス、およびSystem.Object) にマーシャリングする参照型が含まれている場合structure、マネージド オブジェクトは参照カウントで維持されます。 その他のすべての参照型 (文字列や配列など) は、コピーにマーシャリングされます。 これらのマネージド オブジェクトまたはアンマネージド オブジェクトを解放するには、メモリ ブロックを解放する Marshal.DestroyStructure 前にメソッドを呼び出す必要があります。

メソッドを使用して後で別のStructureToPtrインスタンスをメモリ ブロックにコピーする場合は、前のインスタンスの参照型の参照カウントを削除するように指定true``fDeleteOldします。 それ以外の場合は、マネージド参照型とアンマネージド コピーが実質的にリークされます。

使用 StructureToPtr する全体的なパターンは次のとおりです。

  1. メモリ ブロックが割り当てられた後のメソッドの StructureToPtr 最初の呼び出しでは、 fDeleteOld クリアする内容がないため、次のようにする必要があります false

    重要

    ブロックに有効なデータが含まれている場合にのみ、for をfDeleteOld指定trueします。

  2. 別のインスタンスをメモリ ブロックにコピーし、オブジェクトに参照型が含まれている場合はtruefDeleteOld古い内容の参照型を解放する必要があります。

  3. オブジェクトに参照型が含まれている場合は、メモリ ブロックを解放する前に DestroyStructure メソッドを呼び出す必要があります。

注意

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

こちらもご覧ください

適用対象

StructureToPtr<T>(T, IntPtr, Boolean)

[.NET Framework 4.5.1 以降のバージョンでサポート]

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

public:
generic <typename T>
 static void StructureToPtr(T structure, IntPtr ptr, bool fDeleteOld);
[System.Security.SecurityCritical]
public static void StructureToPtr<T> (T structure, IntPtr ptr, bool fDeleteOld);
public static void StructureToPtr<T> (T structure, IntPtr ptr, bool fDeleteOld);
[<System.Security.SecurityCritical>]
static member StructureToPtr : 'T * nativeint * bool -> unit
static member StructureToPtr : 'T * nativeint * bool -> unit
Public Shared Sub StructureToPtr(Of T) (structure As T, ptr As IntPtr, fDeleteOld As Boolean)

型パラメーター

T

マネージド オブジェクトの型。

パラメーター

structure
T

マーシャリングするデータを保持すマネージド オブジェクト。 オブジェクトは、書式指定クラスの構造体またはインスタンスである必要があります。

ptr
IntPtr

nativeint

このメソッドを呼び出す前に割り当てる必要があるアンマネージ メモリ ブロックへのポインター。

fDeleteOld
Boolean

このメソッドがデータをコピーする前に、ptr パラメーターに対して DestroyStructure<T>(IntPtr) メソッドを呼び出す場合は true。 ブロックには有効なデータを含める必要があります。 メモリ ブロックに既にデータが格納されているときに false を渡すと、メモリ リークが発生する可能性があることに注意してください。

属性

例外

structure は書式指定クラスではない参照型です。

注釈

書式設定されたクラスは、属性によって StructLayoutAttribute レイアウトが指定されている参照型です 。いずれか LayoutKind.Explicit または LayoutKind.Sequential.

StructureToPtr<T>(T, IntPtr, Boolean) は、パラメーターが structure 指す事前割り当て済みのメモリ ブロックにコンテンツを ptr コピーします。 COM インターフェイス ポインター (インターフェイス、レイアウトのないクラス、およびSystem.Object) にマーシャリングする参照型が含まれている場合structure、マネージド オブジェクトは参照カウントで維持されます。 その他のすべての参照型 (文字列や配列など) は、コピーにマーシャリングされます。 これらのマネージド オブジェクトまたはアンマネージド オブジェクトを解放するには、メモリ ブロックを解放する DestroyStructure<T>(IntPtr) 前にメソッドを呼び出す必要があります。

メソッドを使用して後で別のStructureToPtr<T>(T, IntPtr, Boolean)インスタンスをメモリ ブロックにコピーする場合は、前のインスタンスの参照型の参照カウントを削除するように指定true``fDeleteOldします。 それ以外の場合は、マネージド参照型とアンマネージド コピーが実質的にリークされます。

使用 StructureToPtr<T>(T, IntPtr, Boolean) する全体的なパターンは次のとおりです。

  1. メモリ ブロックが割り当てられた後のメソッドの StructureToPtr 最初の呼び出しでは、 fDeleteOld クリアする内容がないため、次のようにする必要があります false

    重要

    ブロックに有効なデータが含まれている場合にのみ、for をfDeleteOld指定trueします。

  2. 別のインスタンスをメモリ ブロックにコピーし、オブジェクトに参照型が含まれている場合はtruefDeleteOld古い内容の参照型を解放する必要があります。

  3. オブジェクトに参照型が含まれている場合は、メモリ ブロックを解放する前に DestroyStructure メソッドを呼び出す必要があります。

注意

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

こちらもご覧ください

適用対象