Método Marshal.StructureToPtr (Object, IntPtr, Boolean)
Observação
The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.
Realizar o marshaling de dados de um objeto gerenciado para um bloco não gerenciado de memória.
Namespace: System.Runtime.InteropServices
Assembly: mscorlib (em mscorlib.dll)
Sintaxe
[SecurityCriticalAttribute]
[ComVisibleAttribute(true)]
public static void StructureToPtr(
object structure,
IntPtr ptr,
bool fDeleteOld
)
public:
[SecurityCriticalAttribute]
[ComVisibleAttribute(true)]
static void StructureToPtr(
Object^ structure,
IntPtr ptr,
bool fDeleteOld
)
[<SecurityCriticalAttribute>]
[<ComVisibleAttribute(true)>]
static member StructureToPtr :
structure:Object *
ptr:nativeint *
fDeleteOld:bool -> unit
<SecurityCriticalAttribute>
<ComVisibleAttribute(True)>
Public Shared Sub StructureToPtr (
structure As Object,
ptr As IntPtr,
fDeleteOld As Boolean
)
Parâmetros
structure
Type: System.ObjectUm 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
Type: System.IntPtrUm ponteiro para um bloco não gerenciado de memória, que deve ser alocado antes que este método seja chamado.
fDeleteOld
Type: System.Booleantrue para chamar o método Marshal.DestroyStructure 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.
Exceções
Exception | Condition |
---|---|
ArgumentException | structure é um tipo de referência que não é uma classe formatada. -ou- structure é um tipo genérico. |
Comentários
Se structure é um tipo de valor pode ser demarcado ou desencaixotado. Se ele é convertido, é não demarcado antes de copiar.
Uma classe formatada é um tipo de referência cujo layout é especificado pelo StructLayoutAttribute atributo, como LayoutKind.Explicit ou LayoutKind.Sequential.
StructureToPtrCopia o conteúdo de structure para o bloco pré-alocados de memória que o ptr parâmetro aponta para. Se structure contém tipos de referência que realizar marshaling de ponteiros de interface COM (interfaces, classes sem layout, e System.Object), os objetos gerenciados são mantidos ativas 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.DestroyStructuremé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 em um momento posterior, especifique true para fDeleteOld remover a referência de conta para tipos de referência na instância anterior. Caso contrário, as cópias de typesand não gerenciado de referência gerenciada efetivamente seja perdidas.
O padrão geral para usar StructureToPtr é o seguinte:
Na primeira chamada para o StructureToPtrmétodo depois que um bloco de memória foi alocado, fDeleteOlddevem serfalse, pois não há nenhum conteúdo para limpar.
Importante
Especifique true para fDeleteOld somente se o bloco contém dados válidos.
Se você copiar uma instância diferente para o bloco de memória e o objeto contém os tipos de referência, fDeleteOld devem ser true para liberar os tipos de referência no conteúdo antigo.
Se o objeto contiver tipos de referência, você deve chamar o DestroyStructure método antes de liberar o bloco de memória.
Observação
Para fixar uma estrutura existente em vez de copiá-lo, use o System.Runtime.InteropServices.GCHandle tipo para criar um identificador fixo para a estrutura. Para obter detalhes sobre como fixar, consulte Copiando e fixando.
Exemplos
O exemplo a seguir cria uma estrutura gerenciada, transfere-a memória não gerenciada usando o StructureToPtr método e, em seguida, transfere-o novamente para 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
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
Segurança
requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.
Informações de Versão
Plataforma Universal do Windows
Disponível desde 8
.NET Framework
Disponível desde 1.1
Biblioteca de Classes Portátil
Com suporte no: plataformas portáteis do .NET
Silverlight
Disponível desde 2.0
Windows Phone Silverlight
Disponível desde 7.0
Windows Phone
Disponível desde 8.1
Confira Também
DestroyStructure
GCHandle
StructureToPtr Sobrecarga
Classe Marshal
Namespace System.Runtime.InteropServices
Retornar ao início