Marshal.StructureToPtr メソッド

定義

オーバーロード

StructureToPtr(Object, IntPtr, Boolean)
古い.

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

StructureToPtr<T>(T, IntPtr, Boolean)

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

StructureToPtr(Object, IntPtr, Boolean)

ソース:
Marshal.cs
ソース:
Marshal.cs
ソース:
Marshal.CoreCLR.cs

注意事項

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.SequentialとしてLayoutKind.Explicitレイアウトが指定された参照型です。

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

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

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

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

    重要

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

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

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

注意

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

こちらもご覧ください

適用対象

StructureToPtr<T>(T, IntPtr, Boolean)

ソース:
Marshal.cs
ソース:
Marshal.cs
ソース:
Marshal.cs

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

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.SequentialとしてLayoutKind.Explicitレイアウトが指定された参照型です。

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

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

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

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

    重要

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

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

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

注意

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

こちらもご覧ください

適用対象