Marshal.PtrToStructure Método

Definición

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

Sobrecargas

PtrToStructure(IntPtr, Object)
Obsoletos.

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

PtrToStructure(IntPtr, Type)
Obsoletos.

Calcula las referencias a los datos desde un bloque de memoria no administrado a un objeto administrado y recién asignado del tipo especificado.

PtrToStructure<T>(IntPtr)

Serializa las referencias a los datos desde un bloque de memoria no administrado a un objeto administrado y recién asignado del tipo especificado por un parámetro de tipo genérico.

PtrToStructure<T>(IntPtr, T)

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

PtrToStructure(IntPtr, Object)

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

Precaución

PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512

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

C#
[System.Obsolete("PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512")]
[System.Security.SecurityCritical]
public static void PtrToStructure (IntPtr ptr, object structure);
C#
public static void PtrToStructure (IntPtr ptr, object structure);
C#
[System.Security.SecurityCritical]
public static void PtrToStructure (IntPtr ptr, object structure);
C#
[System.Runtime.InteropServices.ComVisible(true)]
public static void PtrToStructure (IntPtr ptr, object structure);
C#
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static void PtrToStructure (IntPtr ptr, object structure);

Parámetros

ptr
IntPtr

Puntero a un bloque de memoria no administrado.

structure
Object

Objeto en el que se copiarán los datos. Este objeto debe ser una instancia de una clase con formato.

Atributos

Excepciones

El diseño de la estructura no es secuencial ni explícito.

o bien

La estructura es un tipo de valor al que se ha aplicado la conversión boxing.

Comentarios

PtrToStructure a menudo es necesario en la interoperabilidad COM e invocación de plataforma cuando los parámetros de estructura se representan como un System.IntPtr valor. No se puede usar este método de sobrecarga con tipos de valor. Si el ptr parámetro es IntPtr.Zeroigual a , null se devolverá.

Se aplica a

.NET 9 e outras versións
Produto Versións (Obsoleto)
.NET Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9 (Core 1.0)
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.1, 2.0, 2.1 (1.2, 1.3, 1.4, 1.5, 1.6)
UWP (10.0)

PtrToStructure(IntPtr, Type)

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

Precaución

PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513

Calcula las referencias a los datos desde un bloque de memoria no administrado a un objeto administrado y recién asignado del tipo especificado.

C#
[System.Obsolete("PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513")]
[System.Security.SecurityCritical]
public static object PtrToStructure (IntPtr ptr, Type structureType);
C#
public static object? PtrToStructure (IntPtr ptr, Type structureType);
C#
[System.Security.SecurityCritical]
public static object PtrToStructure (IntPtr ptr, Type structureType);
C#
public static object PtrToStructure (IntPtr ptr, Type structureType);
C#
[System.Runtime.InteropServices.ComVisible(true)]
public static object PtrToStructure (IntPtr ptr, Type structureType);
C#
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static object PtrToStructure (IntPtr ptr, Type structureType);

Parámetros

ptr
IntPtr

Puntero a un bloque de memoria no administrado.

structureType
Type

Tipo de objeto que se va a crear. Este objeto debe representar una clase con formato o una estructura.

Devoluciones

Objeto administrado que contiene los datos a los que apunta el parámetro ptr.

Atributos

Excepciones

El diseño del parámetro structureType no es secuencial ni explícito.

o bien

El parámetro structureType es una definición de tipo genérico.

structureType es null.

La clase que ha especificado el elemento structureType no tiene ningún constructor sin parámetros accesible.

Ejemplos

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

C#
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);
        }
    }
}

En el ejemplo siguiente se muestra cómo serializar un bloque de memoria no administrado en una estructura administrada mediante el PtrToStructure método .

Importante

Este código supone la compilación de 32 bits. Antes de usar un compilador de 64 bits, reemplace por IntPtr.ToInt32IntPtr.ToInt64.

C#

        [StructLayout(LayoutKind.Sequential)]

        public class  INNER

        {

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]

            public string field1 = "Test";
        }	

        [StructLayout(LayoutKind.Sequential)]

        public struct OUTER

        {

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]

            public string field1;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst =  100)]

            public byte[] inner;
        }
        [DllImport(@"SomeTestDLL.dll")]

        public static extern void CallTest( ref OUTER po);
        static void Main(string[] args)

        {

            OUTER ed = new OUTER();

            INNER[] inn=new INNER[10];

            INNER test = new INNER();

            int iStructSize = Marshal.SizeOf(test);
            int sz =inn.Length * iStructSize;

            ed.inner = new byte[sz];
            try

            {

                CallTest( ref ed);
            }

            catch(Exception e)

            {

                Console.WriteLine(e.Message);
            }

            IntPtr buffer = Marshal.AllocCoTaskMem(iStructSize*10);

            Marshal.Copy(ed.inner,0,buffer,iStructSize*10);
            int iCurOffset = 0;

            for(int i=0;i<10;i++)

            {
                inn[i] = (INNER)Marshal.PtrToStructure(new
IntPtr(buffer.ToInt32()+iCurOffset),typeof(INNER) );

                iCurOffset += iStructSize;
            }

            Console.WriteLine(ed.field1);

            Marshal.FreeCoTaskMem(buffer);
        }

Comentarios

PtrToStructure a menudo es necesario en la interoperabilidad COM e invocación de plataforma cuando los parámetros de estructura se representan como un System.IntPtr valor. Puede pasar un tipo de valor a este método de sobrecarga. En este caso, el objeto devuelto es una instancia boxed. Si el ptr parámetro es IntPtr.Zeroigual a , null se devolverá.

Consulte también

Se aplica a

.NET 9 e outras versións
Produto Versións (Obsoleto)
.NET Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9 (Core 1.0)
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.1, 2.0, 2.1 (1.2, 1.3, 1.4, 1.5, 1.6)
UWP (10.0)

PtrToStructure<T>(IntPtr)

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

Serializa las referencias a los datos desde un bloque de memoria no administrado a un objeto administrado y recién asignado del tipo especificado por un parámetro de tipo genérico.

C#
[System.Security.SecurityCritical]
public static T PtrToStructure<T> (IntPtr ptr);
C#
public static T? PtrToStructure<T> (IntPtr ptr);
C#
public static T PtrToStructure<T> (IntPtr ptr);

Parámetros de tipo

T

Tipo de objeto en el que se copiarán los datos. Este objeto debe ser una clase con formato o una estructura.

Parámetros

ptr
IntPtr

Puntero a un bloque de memoria no administrado.

Devoluciones

T

Objeto administrado que contiene los datos a los que apunta el parámetro ptr.

Atributos

Excepciones

El diseño de T no es secuencial ni explícito.

La clase que ha especificado el elemento T no tiene ningún constructor sin parámetros accesible.

Comentarios

PtrToStructure<T>(IntPtr) a menudo es necesario en la interoperabilidad COM e invocación de plataforma cuando los parámetros de estructura se representan como System.IntPtr valores. Puede pasar un tipo de valor a esta sobrecarga de método. Si el ptr parámetro es igual IntPtr.Zero a y T es un tipo de referencia, null se devuelve. Si ptr es IntPtr.Zero igual a y T es un tipo de valor, se produce una NullReferenceException excepción .

Se aplica a

.NET 9 e outras versións
Produto Versións
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

PtrToStructure<T>(IntPtr, T)

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

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

C#
[System.Security.SecurityCritical]
public static void PtrToStructure<T> (IntPtr ptr, T structure);
C#
public static void PtrToStructure<T> (IntPtr ptr, T structure);

Parámetros de tipo

T

Tipo de structure. Debe ser una clase con formato.

Parámetros

ptr
IntPtr

Puntero a un bloque de memoria no administrado.

structure
T

Objeto en el que se copiarán los datos.

Atributos

Excepciones

El diseño de la estructura no es secuencial ni explícito.

Comentarios

PtrToStructure<T>(IntPtr, T) a menudo es necesario en la interoperabilidad COM e invocación de plataforma cuando los parámetros de estructura se representan como IntPtr valores. No se puede usar esta sobrecarga de método con tipos de valor. Si el ptr parámetro es igual IntPtr.Zero a y T es un tipo de referencia, null se devuelve. Si ptr es IntPtr.Zero igual a y T es un tipo de valor, se produce una NullReferenceException excepción .

Se aplica a

.NET 9 e outras versións
Produto Versións
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0