Marshal.StructureToPtr Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Überlädt
StructureToPtr(Object, IntPtr, Boolean) |
Veraltet.
Marshallt Daten aus einem verwalteten Objekt zu einem nicht verwalteten Speicherblock. |
StructureToPtr<T>(T, IntPtr, Boolean) |
[Wird nur in .NET Framework 4.5.1 und neueren Versionen unterstützt] Marshallt Daten aus einem verwalteten Objekt eines festgelegten Typs zu einem nicht verwalteten Speicherblock. |
StructureToPtr(Object, IntPtr, Boolean)
Achtung
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
Marshallt Daten aus einem verwalteten Objekt zu einem nicht verwalteten Speicherblock.
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)
Parameter
- structure
- Object
Ein verwaltetes Objekt mit den zu marshallenden Daten. Dieses Objekt muss eine Struktur oder Instanz einer formatierten Klasse sein.
- ptr
-
IntPtr
nativeint
Ein Zeiger auf einen nicht verwalteten Speicherblock, der vor dem Aufruf der Methode belegt werden muss.
- fDeleteOld
- Boolean
true
, wenn die DestroyStructure(IntPtr, Type)-Methode für den ptr
-Parameter aufgerufen werden soll, bevor diese Methode die Daten kopiert. Der Block muss gültige Daten enthalten. Beachten Sie, dass das Übergeben von false
, wenn der Speicherblock bereits Daten enthält, zu einem Speicherverlust führen kann.
- Attribute
Ausnahmen
structure
ist ein Verweistyp, der keine formatierte Klasse ist.
- oder -
structure
ist eine Instanz eines generischen Typs (nur in .NET Framework 4.5 und früheren Versionen).
Beispiele
Im folgenden Beispiel wird eine verwaltete Struktur erstellt, mithilfe der StructureToPtr Methode an nicht verwalteten Arbeitsspeicher übertragen und dann mithilfe der PtrToStructure Methode wieder an verwalteten Arbeitsspeicher übertragen.
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
Hinweise
Wenn structure
es sich um einen Werttyp handelt, kann er boxt oder unboxed werden. Wenn es eingeboxt ist, wird er vor dem Kopieren aufgehoben.
Eine formatierte Klasse ist ein Bezugstyp, dessen Layout durch das StructLayoutAttribute Attribut angegeben wird, entweder LayoutKind.Explicit oder LayoutKind.Sequential.
StructureToPtr kopiert den Inhalt structure
des zuvor zugewiesenen Speicherblocks, auf den der ptr
Parameter verweist. Wenn structure
Referenztypen enthalten sind, die auf COM-Schnittstellenzeiger (Schnittstellen, Klassen ohne Layout) System.Objectund ), werden die verwalteten Objekte mit Bezugsanzahl lebendig gehalten. Alle anderen Referenztypen (z. B. Zeichenfolgen und Arrays) werden in Kopien gemarschiert. Um diese verwalteten oder nicht verwalteten Objekte freizugeben, müssen Sie die Marshal.DestroyStructure Methode aufrufen, bevor Sie den Speicherblock freigeben.
Wenn Sie die StructureToPtr Methode verwenden, um eine andere Instanz zu einem späteren Zeitpunkt in den Speicherblock zu kopieren, geben Sie true
an fDeleteOld
, dass Referenzanzahlen für Referenztypen in der vorherigen Instanz entfernt werden sollen. Andernfalls werden die verwalteten Referenztypen und nicht verwalteten Kopien effektiv geleert.
Das Gesamtmuster für die Verwendung StructureToPtr ist wie folgt:
Auf dem ersten Aufruf der StructureToPtr Methode, nachdem ein Speicherblock zugewiesen wurde, muss
false
sein,fDeleteOld
da kein Inhalt gelöscht werden kann.Wichtig
Geben Sie nur an
true
fDeleteOld
, wenn der Block gültige Daten enthält.Wenn Sie eine andere Instanz in den Speicherblock kopieren und das Objekt Referenztypen enthält,
fDeleteOld
muss es sichtrue
um kostenlose Verweistypen im alten Inhalt handeln.Wenn das Objekt Referenztypen enthält, müssen Sie die DestroyStructure Methode aufrufen, bevor Sie den Speicherblock freigeben.
Hinweis
Wenn Sie eine vorhandene Struktur anheften möchten, anstatt sie zu kopieren, verwenden Sie den System.Runtime.InteropServices.GCHandle Typ, um einen angehefteten Handle für die Struktur zu erstellen. Ausführliche Informationen zum Anheften finden Sie unter Kopieren und Anheften.
Siehe auch
Gilt für
StructureToPtr<T>(T, IntPtr, Boolean)
[Wird nur in .NET Framework 4.5.1 und neueren Versionen unterstützt]
Marshallt Daten aus einem verwalteten Objekt eines festgelegten Typs zu einem nicht verwalteten Speicherblock.
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)
Typparameter
- T
Der Typ des verwalteten Objekts.
Parameter
- structure
- T
Ein verwaltetes Objekt mit den zu marshallenden Daten. Dieses Objekt muss eine Struktur oder Instanz einer formatierten Klasse sein.
- ptr
-
IntPtr
nativeint
Ein Zeiger auf einen nicht verwalteten Speicherblock, der vor dem Aufruf der Methode belegt werden muss.
- fDeleteOld
- Boolean
true
, wenn die DestroyStructure<T>(IntPtr)-Methode für den ptr
-Parameter aufgerufen werden soll, bevor diese Methode die Daten kopiert. Der Block muss gültige Daten enthalten. Beachten Sie, dass das Übergeben von false
, wenn der Speicherblock bereits Daten enthält, zu einem Speicherverlust führen kann.
- Attribute
Ausnahmen
structure
ist ein Verweistyp, der keine formatierte Klasse ist.
Hinweise
Eine formatierte Klasse ist ein Bezugstyp, dessen Layout durch das StructLayoutAttribute Attribut angegeben wird, entweder LayoutKind.Explicit oder LayoutKind.Sequential.
StructureToPtr<T>(T, IntPtr, Boolean) kopiert den Inhalt structure
des zuvor zugewiesenen Speicherblocks, auf den der ptr
Parameter verweist. Wenn structure
Referenztypen enthalten sind, die auf COM-Schnittstellenzeiger (Schnittstellen, Klassen ohne Layout) System.Objectund ), werden die verwalteten Objekte mit Bezugsanzahl lebendig gehalten. Alle anderen Referenztypen (z. B. Zeichenfolgen und Arrays) werden in Kopien gemarschiert. Um diese verwalteten oder nicht verwalteten Objekte freizugeben, müssen Sie die DestroyStructure<T>(IntPtr) Methode aufrufen, bevor Sie den Speicherblock freigeben.
Wenn Sie die StructureToPtr<T>(T, IntPtr, Boolean) Methode verwenden, um eine andere Instanz zu einem späteren Zeitpunkt in den Speicherblock zu kopieren, geben Sie true
an fDeleteOld
, dass Referenzanzahlen für Referenztypen in der vorherigen Instanz entfernt werden sollen. Andernfalls werden die verwalteten Referenztypen und nicht verwalteten Kopien effektiv geleert.
Das Gesamtmuster für die Verwendung StructureToPtr<T>(T, IntPtr, Boolean) ist wie folgt:
Auf dem ersten Aufruf der StructureToPtr Methode, nachdem ein Speicherblock zugewiesen wurde, muss
false
sein,fDeleteOld
da kein Inhalt gelöscht werden kann.Wichtig
Geben Sie nur an
true
fDeleteOld
, wenn der Block gültige Daten enthält.Wenn Sie eine andere Instanz in den Speicherblock kopieren und das Objekt Referenztypen enthält,
fDeleteOld
muss es sichtrue
um kostenlose Verweistypen im alten Inhalt handeln.Wenn das Objekt Referenztypen enthält, müssen Sie die DestroyStructure Methode aufrufen, bevor Sie den Speicherblock freigeben.
Hinweis
Wenn Sie eine vorhandene Struktur anheften möchten, anstatt sie zu kopieren, verwenden Sie den System.Runtime.InteropServices.GCHandle Typ, um einen angehefteten Handle für die Struktur zu erstellen. Ausführliche Informationen zum Anheften finden Sie unter Kopieren und Anheften.