Marshal.StructureToPtr Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
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 :
Lors du premier appel à la StructureToPtr méthode après l’allocation d’un bloc de mémoire,
fDeleteOld
doit êtrefalse
, car il n’y a aucun contenu à effacer.Important
Spécifiez
true
uniquement pourfDeleteOld
si le bloc contient des données valides.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 êtretrue
pour libérer des types de référence dans l’ancien contenu.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 :
Lors du premier appel à la StructureToPtr méthode après l’allocation d’un bloc de mémoire,
fDeleteOld
doit êtrefalse
, car il n’y a aucun contenu à effacer.Important
Spécifiez
true
uniquement pourfDeleteOld
si le bloc contient des données valides.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 êtretrue
pour libérer des types de référence dans l’ancien contenu.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.