Condividi tramite


Marshal.StructureToPtr Metodo

Definizione

Overload

StructureToPtr(Object, IntPtr, Boolean)
Obsoleti.

Effettua il marshalling di dati da un oggetto gestito a un blocco di memoria non gestito.

StructureToPtr<T>(T, IntPtr, Boolean)

Effettua il marshalling di dati da un oggetto gestito di un tipo specificato a un blocco di memoria non gestita.

StructureToPtr(Object, IntPtr, Boolean)

Origine:
Marshal.cs
Origine:
Marshal.cs
Origine:
Marshal.CoreCLR.cs

Attenzione

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

Effettua il marshalling di dati da un oggetto gestito a un blocco di memoria non gestito.

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)

Parametri

structure
Object

Oggetto gestito che contiene i dati di cui effettuare il marshalling. L'oggetto deve essere una struttura o un'istanza di una classe formattata.

ptr
IntPtr

nativeint

Puntatore a un blocco di memoria non gestito che deve essere allocato prima della chiamata al metodo.

fDeleteOld
Boolean

true per chiamare il metodo DestroyStructure(IntPtr, Type) sul parametro ptr prima che il metodo esegua la copia dei dati. Il blocco deve contenere dati validi. Si noti che passare il valore false quando il blocco di memoria contiene già dei dati può causare una perdita di memoria.

Attributi

Eccezioni

structure è un tipo di riferimento che non corrisponde a una classe formattata.

-oppure-

structure è un'istanza di un tipo generico (in .NET Framework 4.5 e versioni precedenti).

Esempio

L'esempio seguente crea una struttura gestita, la trasferisce alla memoria non gestita usando il StructureToPtr metodo e quindi la trasferisce nuovamente alla memoria gestita usando il PtrToStructure metodo .

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

Commenti

Se structure è un tipo di valore, può essere boxed o unboxed. Se è sottoposto a boxing, viene unboxed prima di copiare.

Una classe formattata è un tipo riferimento il cui layout è specificato dall'attributo StructLayoutAttribute , come LayoutKind.Explicit o LayoutKind.Sequential.

StructureToPtr copia il contenuto di structure nel blocco di memoria preallocato a cui punta il ptr parametro. Se structure contiene tipi di riferimento che eseguono il marshalling ai puntatori di interfaccia COM (interfacce, classi senza layout e System.Object), gli oggetti gestiti vengono mantenuti attivi con i conteggi dei riferimenti. Tutti gli altri tipi di riferimento(ad esempio stringhe e matrici) vengono sottoposto a marshalling in copie. Per rilasciare questi oggetti gestiti o non gestiti, è necessario chiamare il Marshal.DestroyStructure metodo prima di liberare il blocco di memoria.

Se si usa il StructureToPtr metodo per copiare un'istanza diversa nel blocco di memoria in un secondo momento, specificare true per fDeleteOld rimuovere i conteggi dei riferimenti per i tipi di riferimento nell'istanza precedente. In caso contrario, i tipi di riferimento gestiti e le copie non gestite vengono effettivamente persi.

Il modello complessivo per l'uso StructureToPtr è il seguente:

  1. Nella prima chiamata al metodo dopo l'allocazione StructureToPtr di un blocco di memoria, fDeleteOld deve essere false, perché non sono presenti contenuti da cancellare.

    Importante

    Specificare true per fDeleteOld solo se il blocco contiene dati validi.

  2. Se si copia un'istanza diversa nel blocco di memoria e l'oggetto contiene tipi riferimento, fDeleteOld deve essere true per liberare i tipi riferimento nel contenuto precedente.

  3. Se l'oggetto contiene tipi riferimento, è necessario chiamare il DestroyStructure metodo prima di liberare il blocco di memoria.

Nota

Per aggiungere una struttura esistente anziché copiarla, usare il System.Runtime.InteropServices.GCHandle tipo per creare un handle aggiunto per la struttura. Per informazioni dettagliate su come aggiungere, vedere Copia e aggiunta.

Vedi anche

Si applica a

StructureToPtr<T>(T, IntPtr, Boolean)

Origine:
Marshal.cs
Origine:
Marshal.cs
Origine:
Marshal.cs

Effettua il marshalling di dati da un oggetto gestito di un tipo specificato a un blocco di memoria non gestita.

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)

Parametri di tipo

T

Tipo dell'oggetto gestito.

Parametri

structure
T

Oggetto gestito che contiene i dati di cui effettuare il marshalling. L'oggetto deve essere una struttura o un'istanza di una classe formattata.

ptr
IntPtr

nativeint

Puntatore a un blocco di memoria non gestito che deve essere allocato prima della chiamata al metodo.

fDeleteOld
Boolean

true per chiamare il metodo DestroyStructure<T>(IntPtr) sul parametro ptr prima che il metodo esegua la copia dei dati. Il blocco deve contenere dati validi. Si noti che passare il valore false quando il blocco di memoria contiene già dei dati può causare una perdita di memoria.

Attributi

Eccezioni

structure è un tipo di riferimento che non corrisponde a una classe formattata.

Commenti

Una classe formattata è un tipo riferimento il cui layout è specificato dall'attributo StructLayoutAttribute , come LayoutKind.Explicit o LayoutKind.Sequential.

StructureToPtr<T>(T, IntPtr, Boolean) copia il contenuto di structure nel blocco di memoria preallocato a cui punta il ptr parametro. Se structure contiene tipi di riferimento che eseguono il marshalling ai puntatori di interfaccia COM (interfacce, classi senza layout e System.Object), gli oggetti gestiti vengono mantenuti attivi con i conteggi dei riferimenti. Tutti gli altri tipi di riferimento(ad esempio stringhe e matrici) vengono sottoposto a marshalling in copie. Per rilasciare questi oggetti gestiti o non gestiti, è necessario chiamare il DestroyStructure<T>(IntPtr) metodo prima di liberare il blocco di memoria.

Se si usa il StructureToPtr<T>(T, IntPtr, Boolean) metodo per copiare un'istanza diversa nel blocco di memoria in un secondo momento, specificare true per fDeleteOld rimuovere i conteggi dei riferimenti per i tipi di riferimento nell'istanza precedente. In caso contrario, i tipi di riferimento gestiti e le copie non gestite vengono effettivamente persi.

Il modello complessivo per l'uso StructureToPtr<T>(T, IntPtr, Boolean) è il seguente:

  1. Nella prima chiamata al metodo dopo l'allocazione StructureToPtr di un blocco di memoria, fDeleteOld deve essere false, perché non sono presenti contenuti da cancellare.

    Importante

    Specificare true per fDeleteOld solo se il blocco contiene dati validi.

  2. Se si copia un'istanza diversa nel blocco di memoria e l'oggetto contiene tipi riferimento, fDeleteOld deve essere true per liberare i tipi riferimento nel contenuto precedente.

  3. Se l'oggetto contiene tipi riferimento, è necessario chiamare il DestroyStructure metodo prima di liberare il blocco di memoria.

Nota

Per aggiungere una struttura esistente anziché copiarla, usare il System.Runtime.InteropServices.GCHandle tipo per creare un handle aggiunto per la struttura. Per informazioni dettagliate su come aggiungere, vedere Copia e aggiunta.

Vedi anche

Si applica a