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) |
Marshallt Daten aus einem verwalteten Objekt eines festgelegten Typs zu einem nicht verwalteten Speicherblock. |
StructureToPtr(Object, IntPtr, Boolean)
- Quelle:
- Marshal.cs
- Quelle:
- Marshal.cs
- Quelle:
- Marshal.CoreCLR.cs
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 -Methode in den StructureToPtr nicht verwalteten Arbeitsspeicher übertragen und dann mithilfe der -Methode wieder in den PtrToStructure 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 boxed oder unboxed werden. Wenn es im Kasten ist, wird es vor dem Kopieren ausgepackt.
Eine formatierte Klasse ist ein Verweistyp, dessen Layout durch das StructLayoutAttribute -Attribut als oder LayoutKind.ExplicitLayoutKind.Sequentialangegeben wird.
StructureToPtr kopiert den Inhalt von structure
in den vorab zugewiesenen Speicherblock, auf den der ptr
Parameter verweist. Wenn structure
Verweistypen enthält, die zu COM-Schnittstellenzeigern (Schnittstellen, Klassen ohne Layout und System.Object) marshallen, werden die verwalteten Objekte mit Verweisanzahl am Leben erhalten. Alle anderen Verweistypen (z. B. Zeichenfolgen und Arrays) werden zu Kopien gemarst. 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
für fDeleteOld
an, um die Verweisanzahl für Verweistypen in der vorherigen Instanz zu entfernen. Andernfalls werden die verwalteten Verweistypen und nicht verwalteten Kopien effektiv geleakt.
Das allgemeine Muster für die Verwendung StructureToPtr sieht wie folgt aus:
Beim ersten Aufruf der StructureToPtr -Methode nach der Zuordnung eines Speicherblocks muss der Wert lauten
false
,fDeleteOld
da keine Inhalte zu löschen sind.Wichtig
Geben Sie nur für
fDeleteOld
antrue
, wenn der Block gültige Daten enthält.Wenn Sie eine andere Instanz in den Speicherblock kopieren und das Objekt Verweistypen enthält,
fDeleteOld
müssen Verweistypen im alten Inhalt frei seintrue
.Wenn das Objekt Verweistypen enthält, müssen Sie die DestroyStructure -Methode aufrufen, bevor Sie den Speicherblock freigeben.
Hinweis
Um eine vorhandene Struktur anzuheften, 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.
Weitere Informationen
Gilt für:
StructureToPtr<T>(T, IntPtr, Boolean)
- Quelle:
- Marshal.cs
- Quelle:
- Marshal.cs
- Quelle:
- Marshal.cs
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 Verweistyp, dessen Layout durch das StructLayoutAttribute -Attribut als oder LayoutKind.ExplicitLayoutKind.Sequentialangegeben wird.
StructureToPtr<T>(T, IntPtr, Boolean) kopiert den Inhalt von structure
in den vorab zugewiesenen Speicherblock, auf den der ptr
Parameter verweist. Wenn structure
Verweistypen enthält, die zu COM-Schnittstellenzeigern (Schnittstellen, Klassen ohne Layout und System.Object) marshallen, werden die verwalteten Objekte mit Verweisanzahl am Leben erhalten. Alle anderen Verweistypen (z. B. Zeichenfolgen und Arrays) werden zu Kopien gemarst. 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
für fDeleteOld
an, um die Verweisanzahl für Verweistypen in der vorherigen Instanz zu entfernen. Andernfalls werden die verwalteten Verweistypen und nicht verwalteten Kopien effektiv geleakt.
Das allgemeine Muster für die Verwendung StructureToPtr<T>(T, IntPtr, Boolean) sieht wie folgt aus:
Beim ersten Aufruf der StructureToPtr -Methode nach der Zuordnung eines Speicherblocks muss der Wert lauten
false
,fDeleteOld
da keine Inhalte zu löschen sind.Wichtig
Geben Sie nur für
fDeleteOld
antrue
, wenn der Block gültige Daten enthält.Wenn Sie eine andere Instanz in den Speicherblock kopieren und das Objekt Verweistypen enthält,
fDeleteOld
müssen Verweistypen im alten Inhalt frei seintrue
.Wenn das Objekt Verweistypen enthält, müssen Sie die DestroyStructure -Methode aufrufen, bevor Sie den Speicherblock freigeben.
Hinweis
Um eine vorhandene Struktur anzuheften, 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.