Marshal.StructureToPtr Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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:
Na primeira chamada para o StructureToPtr método depois que um bloco de memória tiver sido alocado,
fDeleteOld
deve serfalse
, porque não há conteúdo a ser limpo.Importante
Especifique
true
apenas parafDeleteOld
se o bloco contiver dados válidos.Se você copiar uma instância diferente para o bloco de memória e o objeto contiver tipos de referência,
fDeleteOld
deverá sertrue
para liberar tipos de referência no conteúdo antigo.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:
Na primeira chamada para o StructureToPtr método depois que um bloco de memória tiver sido alocado,
fDeleteOld
deve serfalse
, porque não há conteúdo a ser limpo.Importante
Especifique
true
apenas parafDeleteOld
se o bloco contiver dados válidos.Se você copiar uma instância diferente para o bloco de memória e o objeto contiver tipos de referência,
fDeleteOld
deverá sertrue
para liberar tipos de referência no conteúdo antigo.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.