Compartir vía


Marshal.StructureToPtr Método

Definición

Sobrecargas

StructureToPtr(Object, IntPtr, Boolean)
Obsoletos.

Calcula las referencias a los datos desde un objeto administrado a un bloque de memoria no administrado.

StructureToPtr<T>(T, IntPtr, Boolean)

Calcula las referencias de un objeto administrado de un tipo especificado a un bloque de memoria no administrado.

StructureToPtr(Object, IntPtr, Boolean)

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

Precaución

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

Calcula las referencias a los datos desde un objeto administrado a un bloque de memoria no administrado.

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)

Parámetros

structure
Object

Objeto administrado que contiene los datos de referencias que se van a calcular. Este objeto debe ser una estructura o una instancia de una clase con formato.

ptr
IntPtr

nativeint

Puntero a un bloque de memoria no administrada que debe ser asignado antes de llamar a este método.

fDeleteOld
Boolean

Es true para llamar al método DestroyStructure(IntPtr, Type) en el parámetro ptr antes de que este método copie los datos. El bloque debe contener datos válidos. Observe que al pasar false cuando el bloque de memoria ya contiene datos puede provocar una fuga de memoria.

Atributos

Excepciones

structure es un tipo de referencia que no es una clase con formato.

o bien

structure es una instancia de un tipo genérico (solo en .NET Framework 4.5 y versiones anteriores).

Ejemplos

En el ejemplo siguiente se crea una estructura administrada, se transfiere a la memoria no administrada mediante el StructureToPtr método y, a continuación, se transfiere a la memoria administrada mediante el PtrToStructure método .

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

Comentarios

Si structure es un tipo de valor, se puede colocar en la conversión boxing o unboxing. Si está boxeado, se desacopla antes de copiarla.

Una clase con formato es un tipo de referencia cuyo diseño especifica el StructLayoutAttribute atributo , como LayoutKind.Explicit o LayoutKind.Sequential.

StructureToPtr copia el contenido de structure en el bloque de memoria asignado previamente al que apunta el ptr parámetro. Si structure contiene tipos de referencia que calculan referencias a punteros de interfaz COM (interfaces, clases sin diseño y System.Object), los objetos administrados se mantienen activos con recuentos de referencias. Todos los demás tipos de referencia (por ejemplo, cadenas y matrices) se serializarán en copias. Para liberar estos objetos administrados o no administrados, debe llamar al Marshal.DestroyStructure método antes de liberar el bloque de memoria.

Si usa el StructureToPtr método para copiar una instancia diferente en el bloque de memoria más adelante, especifique true para fDeleteOld quitar los recuentos de referencia de los tipos de referencia de la instancia anterior. De lo contrario, los tipos de referencia administrados y las copias no administradas se filtran de forma eficaz.

El patrón general para usar StructureToPtr es el siguiente:

  1. En la primera llamada al StructureToPtr método después de asignar un bloque de memoria, fDeleteOld debe ser false, porque no hay contenido que borrar.

    Importante

    Especifique true solo para fDeleteOld si el bloque contiene datos válidos.

  2. Si copia una instancia diferente en el bloque de memoria y el objeto contiene tipos de referencia, fDeleteOld debe ser true para liberar tipos de referencia en el contenido anterior.

  3. Si el objeto contiene tipos de referencia, debe llamar al DestroyStructure método antes de liberar el bloque de memoria.

Nota

Para anclar una estructura existente en lugar de copiarla, use el System.Runtime.InteropServices.GCHandle tipo para crear un identificador anclado para la estructura. Para obtener más información sobre cómo anclar, consulte Copiar y anclar.

Consulte también

Se aplica a

StructureToPtr<T>(T, IntPtr, Boolean)

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

Calcula las referencias de un objeto administrado de un tipo especificado a un bloque de memoria no administrado.

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)

Parámetros de tipo

T

Tipo del objeto administrado.

Parámetros

structure
T

Objeto administrado que contiene los datos de referencias que se van a calcular. El objeto debe ser una estructura o una instancia de una clase con formato.

ptr
IntPtr

nativeint

Puntero a un bloque de memoria no administrada que debe ser asignado antes de llamar a este método.

fDeleteOld
Boolean

Es true para llamar al método DestroyStructure<T>(IntPtr) en el parámetro ptr antes de que este método copie los datos. El bloque debe contener datos válidos. Observe que al pasar false cuando el bloque de memoria ya contiene datos puede provocar una fuga de memoria.

Atributos

Excepciones

structure es un tipo de referencia que no es una clase con formato.

Comentarios

Una clase con formato es un tipo de referencia cuyo diseño especifica el StructLayoutAttribute atributo , como LayoutKind.Explicit o LayoutKind.Sequential.

StructureToPtr<T>(T, IntPtr, Boolean) copia el contenido de structure en el bloque de memoria asignado previamente al que apunta el ptr parámetro. Si structure contiene tipos de referencia que calculan referencias a punteros de interfaz COM (interfaces, clases sin diseño y System.Object), los objetos administrados se mantienen activos con recuentos de referencias. Todos los demás tipos de referencia (por ejemplo, cadenas y matrices) se serializarán en copias. Para liberar estos objetos administrados o no administrados, debe llamar al DestroyStructure<T>(IntPtr) método antes de liberar el bloque de memoria.

Si usa el StructureToPtr<T>(T, IntPtr, Boolean) método para copiar una instancia diferente en el bloque de memoria más adelante, especifique true para fDeleteOld quitar los recuentos de referencia de los tipos de referencia de la instancia anterior. De lo contrario, los tipos de referencia administrados y las copias no administradas se filtran de forma eficaz.

El patrón general para usar StructureToPtr<T>(T, IntPtr, Boolean) es el siguiente:

  1. En la primera llamada al StructureToPtr método después de asignar un bloque de memoria, fDeleteOld debe ser false, porque no hay contenido que borrar.

    Importante

    Especifique true solo para fDeleteOld si el bloque contiene datos válidos.

  2. Si copia una instancia diferente en el bloque de memoria y el objeto contiene tipos de referencia, fDeleteOld debe ser true para liberar tipos de referencia en el contenido anterior.

  3. Si el objeto contiene tipos de referencia, debe llamar al DestroyStructure método antes de liberar el bloque de memoria.

Nota

Para anclar una estructura existente en lugar de copiarla, use el System.Runtime.InteropServices.GCHandle tipo para crear un identificador anclado para la estructura. Para obtener más información sobre cómo anclar, consulte Copiar y anclar.

Consulte también

Se aplica a