Marshal.StructureToPtr Methode

Definition

Ü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:

  1. Auf dem ersten Aufruf der StructureToPtr Methode, nachdem ein Speicherblock zugewiesen wurde, muss falsesein, fDeleteOld da kein Inhalt gelöscht werden kann.

    Wichtig

    Geben Sie nur an true fDeleteOld , wenn der Block gültige Daten enthält.

  2. Wenn Sie eine andere Instanz in den Speicherblock kopieren und das Objekt Referenztypen enthält, fDeleteOld muss es sich true um kostenlose Verweistypen im alten Inhalt handeln.

  3. 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:

  1. Auf dem ersten Aufruf der StructureToPtr Methode, nachdem ein Speicherblock zugewiesen wurde, muss falsesein, fDeleteOld da kein Inhalt gelöscht werden kann.

    Wichtig

    Geben Sie nur an true fDeleteOld , wenn der Block gültige Daten enthält.

  2. Wenn Sie eine andere Instanz in den Speicherblock kopieren und das Objekt Referenztypen enthält, fDeleteOld muss es sich true um kostenlose Verweistypen im alten Inhalt handeln.

  3. 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