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)

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 einen anderen instance zu einem späteren Zeitpunkt in den Speicherblock zu kopieren, geben Sie true für fDeleteOld an, um die Verweisanzahl für Verweistypen im vorherigen instance 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:

  1. Beim ersten Aufruf der StructureToPtr -Methode nach der Zuordnung eines Speicherblocks muss der Wert lautenfalse, fDeleteOld da keine Inhalte zu löschen sind.

    Wichtig

    Geben Sie nur für fDeleteOld antrue, wenn der Block gültige Daten enthält.

  2. Wenn Sie eine andere instance in den Speicherblock kopieren und das Objekt Verweistypen enthält, fDeleteOld müssen verweistypen im alten Inhalt frei seintrue.

  3. 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 einen anderen instance zu einem späteren Zeitpunkt in den Speicherblock zu kopieren, geben Sie true für fDeleteOld an, um die Verweisanzahl für Verweistypen im vorherigen instance 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:

  1. Beim ersten Aufruf der StructureToPtr -Methode nach der Zuordnung eines Speicherblocks muss der Wert lautenfalse, fDeleteOld da keine Inhalte zu löschen sind.

    Wichtig

    Geben Sie nur für fDeleteOld antrue, wenn der Block gültige Daten enthält.

  2. Wenn Sie eine andere instance in den Speicherblock kopieren und das Objekt Verweistypen enthält, fDeleteOld müssen verweistypen im alten Inhalt frei seintrue.

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