Marshal.StructureToPtr Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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:
Nella prima chiamata al metodo dopo l'allocazione StructureToPtr di un blocco di memoria,
fDeleteOld
deve esserefalse
, perché non sono presenti contenuti da cancellare.Importante
Specificare
true
perfDeleteOld
solo se il blocco contiene dati validi.Se si copia un'istanza diversa nel blocco di memoria e l'oggetto contiene tipi riferimento,
fDeleteOld
deve esseretrue
per liberare i tipi riferimento nel contenuto precedente.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:
Nella prima chiamata al metodo dopo l'allocazione StructureToPtr di un blocco di memoria,
fDeleteOld
deve esserefalse
, perché non sono presenti contenuti da cancellare.Importante
Specificare
true
perfDeleteOld
solo se il blocco contiene dati validi.Se si copia un'istanza diversa nel blocco di memoria e l'oggetto contiene tipi riferimento,
fDeleteOld
deve esseretrue
per liberare i tipi riferimento nel contenuto precedente.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.