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

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

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 ます。 structureに COM インターフェイスポインター (インターフェイス、レイアウトのないクラス) にマーシャリングする参照型が含まれている場合 System.Object 、マネージオブジェクトは参照カウントを使用して保持されます。 その他のすべての参照型 (文字列や配列など) は、コピーにマーシャリングされます。 これらのマネージオブジェクトまたはアンマネージオブジェクトを解放するには、 Marshal.DestroyStructure メモリブロックを解放する前にメソッドを呼び出す必要があります。

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

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

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

    重要

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

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

  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

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

fDeleteOld
Boolean

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

属性

例外

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

注釈

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

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

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

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

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

    重要

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

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

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

注意

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

こちらもご覧ください

適用対象