Compartilhar via


Marshal.StructureToPtr Método

Definição

Sobrecargas

StructureToPtr(Object, IntPtr, Boolean)
Obsoleto.

Realizar o marshaling de dados de um objeto gerenciado para um bloco não gerenciado de memória.

StructureToPtr<T>(T, IntPtr, Boolean)

Realiza marshaling de dados de um objeto gerenciado de um tipo especificado para um bloco de memória não gerenciado.

StructureToPtr(Object, IntPtr, Boolean)

Origem:
Marshal.cs
Origem:
Marshal.cs
Origem:
Marshal.CoreCLR.cs

Cuidado

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

Realizar o marshaling de dados de um objeto gerenciado para um bloco não gerenciado de memória.

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

Um objeto gerenciado que mantém os dados que terão o marshaling realizado. Este objeto deve ser uma estrutura ou uma instância de uma classe formatada.

ptr
IntPtr

nativeint

Um ponteiro para um bloco não gerenciado de memória, que deve ser alocado antes que este método seja chamado.

fDeleteOld
Boolean

true para chamar o método DestroyStructure(IntPtr, Type) no parâmetro ptr antes de esse método copiar os dados. O bloco deve conter dados válidos. Observe que passar false quando o bloco de memória já contém dados pode levar a um vazamento de memória.

Atributos

Exceções

structure é um tipo de referência que não é uma classe formatada.

- ou -

structure é uma instância de um tipo genérico (somente no .NET Framework 4.5 e versões anteriores).

Exemplos

O exemplo a seguir cria uma estrutura gerenciada, transfere-a para memória não gerenciada usando o método e, em seguida, transfere-a StructureToPtr de volta para a memória gerenciada usando o 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

Comentários

Se structure for um tipo de valor, ele poderá ser em caixa ou sem caixa. Se estiver em caixa, ele será desmarcando antes de copiar.

Uma classe formatada é um tipo de referência cujo layout é especificado pelo StructLayoutAttribute atributo , como LayoutKind.Explicit ou LayoutKind.Sequential.

StructureToPtr copia o conteúdo de structure para o bloco de memória pré-alocado para o qual o ptr parâmetro aponta. Se structure contiver tipos de referência que fazem marshaling para ponteiros de interface COM (interfaces, classes sem layout e System.Object), os objetos gerenciados serão mantidos ativos com contagens de referência. Todos os outros tipos de referência (por exemplo, cadeias de caracteres e matrizes) são empacotados para cópias. Para liberar esses objetos gerenciados ou não gerenciados, você deve chamar o Marshal.DestroyStructure método antes de liberar o bloco de memória.

Se você usar o StructureToPtr método para copiar uma instância diferente para o bloco de memória posteriormente, especifique true para fDeleteOld remover contagens de referência para tipos de referência na instância anterior. Caso contrário, os tipos de referência gerenciados e as cópias não gerenciadas serão efetivamente vazados.

O padrão geral para usar StructureToPtr é o seguinte:

  1. Na primeira chamada para o StructureToPtr método depois que um bloco de memória tiver sido alocado, fDeleteOld deve ser false, porque não há conteúdo a ser limpo.

    Importante

    Especifique true apenas para fDeleteOld se o bloco contiver dados válidos.

  2. Se você copiar uma instância diferente para o bloco de memória e o objeto contiver tipos de referência, fDeleteOld deverá ser true para liberar tipos de referência no conteúdo antigo.

  3. Se o objeto contiver tipos de referência, você deverá chamar o DestroyStructure método antes de liberar o bloco de memória.

Observação

Para fixar uma estrutura existente em vez de copiá-la, use o System.Runtime.InteropServices.GCHandle tipo para criar um identificador fixado para a estrutura. Para obter detalhes sobre como fixar, consulte Copiar e Fixar.

Confira também

Aplica-se a

StructureToPtr<T>(T, IntPtr, Boolean)

Origem:
Marshal.cs
Origem:
Marshal.cs
Origem:
Marshal.cs

Realiza marshaling de dados de um objeto gerenciado de um tipo especificado para um bloco de memória não gerenciado.

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

O tipo do objeto gerenciado.

Parâmetros

structure
T

Um objeto gerenciado que mantém os dados que terão o marshaling realizado. O objeto deve ser uma estrutura ou uma instância de uma classe formatada.

ptr
IntPtr

nativeint

Um ponteiro para um bloco não gerenciado de memória, que deve ser alocado antes que este método seja chamado.

fDeleteOld
Boolean

true para chamar o método DestroyStructure<T>(IntPtr) no parâmetro ptr antes de esse método copiar os dados. O bloco deve conter dados válidos. Observe que passar false quando o bloco de memória já contém dados pode levar a um vazamento de memória.

Atributos

Exceções

structure é um tipo de referência que não é uma classe formatada.

Comentários

Uma classe formatada é um tipo de referência cujo layout é especificado pelo StructLayoutAttribute atributo , como LayoutKind.Explicit ou LayoutKind.Sequential.

StructureToPtr<T>(T, IntPtr, Boolean) copia o conteúdo de structure para o bloco de memória pré-alocado para o qual o ptr parâmetro aponta. Se structure contiver tipos de referência que fazem marshaling para ponteiros de interface COM (interfaces, classes sem layout e System.Object), os objetos gerenciados serão mantidos ativos com contagens de referência. Todos os outros tipos de referência (por exemplo, cadeias de caracteres e matrizes) são empacotados para cópias. Para liberar esses objetos gerenciados ou não gerenciados, você deve chamar o DestroyStructure<T>(IntPtr) método antes de liberar o bloco de memória.

Se você usar o StructureToPtr<T>(T, IntPtr, Boolean) método para copiar uma instância diferente para o bloco de memória posteriormente, especifique true para fDeleteOld remover contagens de referência para tipos de referência na instância anterior. Caso contrário, os tipos de referência gerenciados e as cópias não gerenciadas serão efetivamente vazados.

O padrão geral para usar StructureToPtr<T>(T, IntPtr, Boolean) é o seguinte:

  1. Na primeira chamada para o StructureToPtr método depois que um bloco de memória tiver sido alocado, fDeleteOld deve ser false, porque não há conteúdo a ser limpo.

    Importante

    Especifique true apenas para fDeleteOld se o bloco contiver dados válidos.

  2. Se você copiar uma instância diferente para o bloco de memória e o objeto contiver tipos de referência, fDeleteOld deverá ser true para liberar tipos de referência no conteúdo antigo.

  3. Se o objeto contiver tipos de referência, você deverá chamar o DestroyStructure método antes de liberar o bloco de memória.

Observação

Para fixar uma estrutura existente em vez de copiá-la, use o System.Runtime.InteropServices.GCHandle tipo para criar um identificador fixado para a estrutura. Para obter detalhes sobre como fixar, consulte Copiar e Fixar.

Confira também

Aplica-se a