Marshal.StructureToPtr Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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:
En la primera llamada al StructureToPtr método después de asignar un bloque de memoria,
fDeleteOld
debe serfalse
, porque no hay contenido que borrar.Importante
Especifique
true
solo parafDeleteOld
si el bloque contiene datos válidos.Si copia una instancia diferente en el bloque de memoria y el objeto contiene tipos de referencia,
fDeleteOld
debe sertrue
para liberar tipos de referencia en el contenido anterior.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:
En la primera llamada al StructureToPtr método después de asignar un bloque de memoria,
fDeleteOld
debe serfalse
, porque no hay contenido que borrar.Importante
Especifique
true
solo parafDeleteOld
si el bloque contiene datos válidos.Si copia una instancia diferente en el bloque de memoria y el objeto contiene tipos de referencia,
fDeleteOld
debe sertrue
para liberar tipos de referencia en el contenido anterior.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.