Calcula las referencias a los datos desde un objeto administrado a un bloque de memoria no administrado.
Espacio de nombres: System.Runtime.InteropServices
Ensamblado: mscorlib (en mscorlib.dll)

Sintaxis
Visual Basic (Declaración)
<ComVisibleAttribute(True)> _
Public Shared Sub StructureToPtr ( _
structure As Object, _
ptr As IntPtr, _
fDeleteOld As Boolean _
)
Dim structure As Object
Dim ptr As IntPtr
Dim fDeleteOld As Boolean
Marshal.StructureToPtr(structure, ptr, fDeleteOld)
[ComVisibleAttribute(true)]
public static void StructureToPtr (
Object structure,
IntPtr ptr,
bool fDeleteOld
)
[ComVisibleAttribute(true)]
public:
static void StructureToPtr (
Object^ structure,
IntPtr ptr,
bool fDeleteOld
)
/** @attribute ComVisibleAttribute(true) */
public static void StructureToPtr (
Object structure,
IntPtr ptr,
boolean fDeleteOld
)
ComVisibleAttribute(true)
public static function StructureToPtr (
structure : Object,
ptr : IntPtr,
fDeleteOld : boolean
)
Parámetros
- structure
Objeto administrado que contiene los datos que se van a calcular. Este objeto debe ser una instancia de una clase con formato.
- ptr
Puntero a un bloque de memoria no administrada que debe ser asignado antes de llamar a este método.
- fDeleteOld
true para permitir una llamada al método Marshal.DestroyStructure en el parámetro ptr antes de que se ejecute este método. Observe que pasar false puede provocar una pérdida de memoria.

Excepciones
| Tipo de excepción | Condición |
|---|
ArgumentException | El parámetro structure es un tipo genérico. |

Comentarios
StructureToPtr copia el contenido de la estructura en el bloque de memoria previamente asignado al que apunta el parámetro ptr. Si el parámetro fDeleteOld es true, el búfer al que ptr apuntaba originalmente se elimina con la API de eliminación correspondiente en el puntero incrustado, pero el búfer debe contener datos válidos. Este método limpia cada campo de referencia especificado en la clase administrada reflejada.
Imagine que ptr apunta al bloque de memoria no administrada. El diseño de este bloque los describe la clase administrada correspondiente, structure. StructureToPtr calcula las referencias a los valores de campo desde una estructura a un puntero. Imagine que el bloque ptr incluye un campo de referencia, que apunta a un búfer de cadena que actualmente contiene "abc". Imagine que el campo correspondiente de la parte administrada es una cadena que contiene "vwxyz". Si no especifica lo contrario, StructureToPtr asigna un nuevo búfer no administrado para conservar "vwxyz" y lo enlaza con el bloque ptr. Esta acción dejará el antiguo búfer "abc" a la deriva sin liberarlo de nuevo al montón no administrado. Al final queda un búfer huérfano que representa una pérdida de memoria en el código. Si establece el parámetro fDeleteOld en true, StructureToPtr libera el búfer que contiene "abc" antes de asignar un nuevo búfer para "vwxyz".

Ejemplo
En el siguiente ejemplo de código se crea una estructura administrada, se transfiere a la memoria no administrada usando el método StructureToPtr y, a continuación, se transfiere de nuevo a la memoria administrada usando el método PtrToStructure.
Imports System
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
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);
}
}
}

Seguridad de .NET Framework

Plataformas
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition
.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

Información de versión
.NET Framework
Compatible con: 2.0, 1.1, 1.0
.NET Compact Framework
Compatible con: 2.0, 1.0

Vea también