Partager via


Marshal.StructureToPtr Méthode

Définition

Surcharges

StructureToPtr(Object, IntPtr, Boolean)
Obsolète.

Marshale les données d’un objet managé dans un bloc de mémoire non managée.

StructureToPtr<T>(T, IntPtr, Boolean)

Marshale les données d'un objet managé d'un type spécifié dans un bloc de mémoire non managée.

StructureToPtr(Object, IntPtr, Boolean)

Source:
Marshal.cs
Source:
Marshal.cs
Source:
Marshal.CoreCLR.cs

Attention

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

Marshale les données d’un objet managé dans un bloc de mémoire non managée.

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)

Paramètres

structure
Object

Objet managé contenant les données à marshaler. Cet objet doit être une structure ou une instance d'une classe mise en forme.

ptr
IntPtr

nativeint

Pointeur vers un bloc de mémoire non managée qui doit être alloué avant l'appel de cette méthode.

fDeleteOld
Boolean

true pour appeler la méthode DestroyStructure(IntPtr, Type) sur le paramètre ptr avant que cette méthode copie les données. Le bloc doit contenir des données valides. Notez que passer false lorsque le bloc de mémoire contient déjà des données peut entraîner une fuite de mémoire.

Attributs

Exceptions

structure est un type référence qui n’est pas une classe mise en forme.

- ou -

structure est une instance d’un type générique (dans le .NET Framework 4.5 et les versions antérieures uniquement).

Exemples

L’exemple suivant crée une structure managée, la transfère à la mémoire non managée à l’aide de la StructureToPtr méthode , puis la transfère à la mémoire managée à l’aide de la PtrToStructure méthode .

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

Remarques

Si structure est un type valeur, il peut être boxed ou unboxed. S’il est en boîte, il est déballé avant la copie.

Une classe mise en forme est un type référence dont la disposition est spécifiée par l’attribut StructLayoutAttribute , comme LayoutKind.Explicit ou LayoutKind.Sequential.

StructureToPtr copie le contenu de structure dans le bloc de mémoire pré-alloué vers lequel pointe le ptr paramètre. Si structure contient des types de référence qui marshalent vers des pointeurs d’interface COM (interfaces, classes sans disposition et System.Object), les objets managés restent actifs avec le nombre de références. Tous les autres types de référence (par exemple, les chaînes et les tableaux) sont marshalés en copies. Pour libérer ces objets managés ou non managés, vous devez appeler la Marshal.DestroyStructure méthode avant de libérer le bloc de mémoire.

Si vous utilisez la StructureToPtr méthode pour copier ultérieurement une instance différente dans le bloc de mémoire, spécifiez true pour fDeleteOld supprimer le nombre de références pour les types de référence dans l’instance précédente. Sinon, les types de référence managés et les copies non managées sont effectivement divulguées.

Le modèle global d’utilisation StructureToPtr est le suivant :

  1. Lors du premier appel à la StructureToPtr méthode après l’allocation d’un bloc de mémoire, fDeleteOld doit être false, car il n’y a aucun contenu à effacer.

    Important

    Spécifiez true uniquement pour fDeleteOld si le bloc contient des données valides.

  2. Si vous copiez une instance différente dans le bloc de mémoire et que l’objet contient des types référence, fDeleteOld doit être true pour libérer des types de référence dans l’ancien contenu.

  3. Si l’objet contient des types référence, vous devez appeler la DestroyStructure méthode avant de libérer le bloc de mémoire.

Notes

Pour épingler une structure existante au lieu de la copier, utilisez le System.Runtime.InteropServices.GCHandle type pour créer un handle épinglé pour la structure. Pour plus d’informations sur l’épinglage, consultez Copie et épinglage.

Voir aussi

S’applique à

StructureToPtr<T>(T, IntPtr, Boolean)

Source:
Marshal.cs
Source:
Marshal.cs
Source:
Marshal.cs

Marshale les données d'un objet managé d'un type spécifié dans un bloc de mémoire non managée.

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)

Paramètres de type

T

Type de l'objet managé.

Paramètres

structure
T

Objet managé contenant les données à marshaler. L'objet doit être une structure ou une instance d'une classe mise en forme.

ptr
IntPtr

nativeint

Pointeur vers un bloc de mémoire non managée qui doit être alloué avant l'appel de cette méthode.

fDeleteOld
Boolean

true pour appeler la méthode DestroyStructure<T>(IntPtr) sur le paramètre ptr avant que cette méthode copie les données. Le bloc doit contenir des données valides. Notez que passer false lorsque le bloc de mémoire contient déjà des données peut entraîner une fuite de mémoire.

Attributs

Exceptions

structure est un type référence qui n’est pas une classe mise en forme.

Remarques

Une classe mise en forme est un type référence dont la disposition est spécifiée par l’attribut StructLayoutAttribute , comme LayoutKind.Explicit ou LayoutKind.Sequential.

StructureToPtr<T>(T, IntPtr, Boolean) copie le contenu de structure dans le bloc de mémoire pré-alloué vers lequel pointe le ptr paramètre. Si structure contient des types de référence qui marshalent vers des pointeurs d’interface COM (interfaces, classes sans disposition et System.Object), les objets managés restent actifs avec le nombre de références. Tous les autres types de référence (par exemple, les chaînes et les tableaux) sont marshalés en copies. Pour libérer ces objets managés ou non managés, vous devez appeler la DestroyStructure<T>(IntPtr) méthode avant de libérer le bloc de mémoire.

Si vous utilisez la StructureToPtr<T>(T, IntPtr, Boolean) méthode pour copier ultérieurement une instance différente dans le bloc de mémoire, spécifiez true pour fDeleteOld supprimer le nombre de références pour les types de référence dans l’instance précédente. Sinon, les types de référence managés et les copies non managées sont effectivement divulguées.

Le modèle global d’utilisation StructureToPtr<T>(T, IntPtr, Boolean) est le suivant :

  1. Lors du premier appel à la StructureToPtr méthode après l’allocation d’un bloc de mémoire, fDeleteOld doit être false, car il n’y a aucun contenu à effacer.

    Important

    Spécifiez true uniquement pour fDeleteOld si le bloc contient des données valides.

  2. Si vous copiez une instance différente dans le bloc de mémoire et que l’objet contient des types référence, fDeleteOld doit être true pour libérer des types de référence dans l’ancien contenu.

  3. Si l’objet contient des types référence, vous devez appeler la DestroyStructure méthode avant de libérer le bloc de mémoire.

Notes

Pour épingler une structure existante au lieu de la copier, utilisez le System.Runtime.InteropServices.GCHandle type pour créer un handle épinglé pour la structure. Pour plus d’informations sur l’épinglage, consultez Copie et épinglage.

Voir aussi

S’applique à