Freigeben über


Marshal.StructureToPtr-Methode

Marshallt Daten aus einem verwalteten Objekt zu einem nicht verwalteten Speicherblock.

Namespace: System.Runtime.InteropServices
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
<ComVisibleAttribute(True)> _
Public Shared Sub StructureToPtr ( _
    structure As Object, _
    ptr As IntPtr, _
    fDeleteOld As Boolean _
)
'Usage
Dim structure As Object
Dim ptr As IntPtr
Dim fDeleteOld As Boolean

Marshal.StructureToPtr(structure, ptr, fDeleteOld)
[ComVisibleAttribute(true)] 
public static void StructureToPtr (
    Object structure,
    IntPtr ptr,
    bool fDeleteOld
)
[ComVisibleAttribute(true)] 
public:
static void StructureToPtr (
    Object^ structure, 
    IntPtr ptr, 
    bool fDeleteOld
)
/** @attribute ComVisibleAttribute(true) */ 
public static void StructureToPtr (
    Object structure, 
    IntPtr ptr, 
    boolean fDeleteOld
)
ComVisibleAttribute(true) 
public static function StructureToPtr (
    structure : Object, 
    ptr : IntPtr, 
    fDeleteOld : boolean
)

Parameter

  • structure
    Ein verwaltetes Objekt mit den zu marshallenden Daten. Dieses Objekt muss eine Instanz einer formatierten Klasse sein.
  • ptr
    Ein Zeiger auf einen nicht verwalteten Speicherblock, der vor dem Aufruf der Methode reserviert werden muss.
  • fDeleteOld
    true, wenn die Marshal.DestroyStructure-Methode für den ptr-Parameter aufgerufen werden soll, bevor diese Methode ausgeführt wird. Beachten Sie, dass die Übergabe von false zu einem Speicherverlust führen kann.

Ausnahmen

Ausnahmetyp Bedingung

ArgumentException

Der structure-Parameter ist ein generischer Typ.

Hinweise

StructureToPtr kopiert den Inhalt der Struktur in den bereits reservierten Speicherblock, auf den der ptr-Parameter zeigt. Wenn der fDeleteOld-Parameter true ist, wird der Puffer, auf den ptr ursprünglich gezeigt hat, mit der entsprechenden Lösch-API für den eingebetteten Zeiger gelöscht. Der Puffer muss jedoch gültige Daten enthalten. Diese Methode bereinigt jedes Verweisfeld, das in der gespiegelten verwalteten Klasse angegeben ist.

Angenommen, ptr zeigt auf den nicht verwalteten Speicherblock. Das Layout dieses Blocks wird durch eine entsprechende verwaltete Klasse (structure) beschrieben. StructureToPtr marshallt die Feldwerte aus einer Struktur zu einem Zeiger. Nehmen Sie nun an, dass der ptr-Block ein Verweisfeld enthält, das auf einen Zeichenfolgenpuffer mit dem aktuellen Inhalt "abc" zeigt. Nehmen Sie weiterhin an, dass das entsprechende Feld auf der verwalteten Seite eine Zeichenfolge mit dem Inhalt "vwxyz" ist. Wenn Sie keine andere Anweisung erteilen, reserviert StructureToPtr einen neuen nicht verwalteten Puffer für den Inhalt "vwxyz" und verknüpft diesen mit dem ptr-Block. Durch diese Aktion wird der alte Puffer "abc" herrenlos, ohne dass er für den nicht verwalteten Heap freigegeben wird. Sie erhalten einen verwaisten Puffer, und dies stellt einen Speicherverlust im Code dar. Wenn Sie den fDeleteOld-Parameter auf True festlegen, gibt StructureToPtr den Puffer mit dem Inhalt "abc" frei, bevor für "vwxyz" ein neuer Puffer reserviert wird.

Hinweis

Wenn eine vorhandene Struktur fixiert und nicht kopiert werden soll, erstellen Sie mithilfe des System.Runtime.InteropServices.GCHandle-Typs ein fixiertes Handle für die Struktur. Ausführliche Informationen zum Fixieren finden Sie unter Kopieren und Fixieren.

Hinweis

Diese Methode verwendet SecurityAction.LinkDemand, um einen Aufruf aus nicht vertrauenswürdigem Code zu verhindern. Nur der direkte Aufrufer muss über die SecurityPermissionAttribute.UnmanagedCode-Berechtigung verfügen. Wenn der Code aus teilweise vertrauenswürdigem Code aufgerufen werden kann, dürfen Benutzereingaben nicht ohne Validierung an Methoden der Marshal-Klasse übergeben werden. Wichtige Einschränkungen bei der Verwendung des LinkDemand-Members finden Sie unter "Demand" und "LinkDemand".

Beispiel

Im folgenden Codebeispiel wird eine verwaltete Struktur erstellt, die zunächst mithilfe der StructureToPtr-Methode in den nicht verwalteten Speicher übertragen und anschließend mithilfe der PtrToStructure-Methode zurück in den verwalteten Speicher übertragen wird.

Imports System
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

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);
        }
        


    }

}

.NET Framework-Sicherheit

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0

Siehe auch

Referenz

Marshal-Klasse
Marshal-Member
System.Runtime.InteropServices-Namespace
DestroyStructure
GCHandle-Struktur