Auf Englisch lesen

Freigeben über


Marshal.PtrToStructure Methode

Definition

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

Überlädt

PtrToStructure(IntPtr, Object)
Veraltet.

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

PtrToStructure(IntPtr, Type)
Veraltet.

Marshallt Daten aus einem nicht verwalteten Speicherblock zu einem neu belegten, verwalteten Objekt des angegebenen Typs.

PtrToStructure<T>(IntPtr)

Marshallt Daten aus einem nicht verwalteten Speicherblock zu einem neu belegten, verwalteten Objekt des von einem generischen Typparameter angegebenen Typs.

PtrToStructure<T>(IntPtr, T)

Marshallt Daten aus einem nicht verwalteten Speicherblock zu einem verwalteten Objekt eines festgelegten Typs.

PtrToStructure(IntPtr, Object)

Quelle:
Marshal.cs
Quelle:
Marshal.cs
Quelle:
Marshal.cs

Achtung

PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512

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

C#
[System.Obsolete("PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512")]
[System.Security.SecurityCritical]
public static void PtrToStructure (IntPtr ptr, object structure);
C#
public static void PtrToStructure (IntPtr ptr, object structure);
C#
[System.Security.SecurityCritical]
public static void PtrToStructure (IntPtr ptr, object structure);
C#
[System.Runtime.InteropServices.ComVisible(true)]
public static void PtrToStructure (IntPtr ptr, object structure);
C#
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static void PtrToStructure (IntPtr ptr, object structure);

Parameter

ptr
IntPtr

Ein Zeiger auf einen nicht verwalteten Speicherblock.

structure
Object

Das Objekt, in das die Daten kopiert werden sollen. Dabei muss es sich um eine Instanz einer formatierten Klasse handeln.

Attribute

Ausnahmen

Das Strukturlayout ist weder sequenziell noch explizit.

- oder -

Die Struktur ist ein geschachtelter Werttyp.

Hinweise

PtrToStructure ist häufig in COM-Interop- und Plattformaufrufen erforderlich, wenn Strukturparameter als System.IntPtr Wert dargestellt werden. Sie können diese Überladungsmethode nicht mit Werttypen verwenden. Wenn der ptr Parameter gleich IntPtr.Zeroist, null wird zurückgegeben.

Gilt für:

.NET 9 und andere Versionen
Produkt Versionen (Veraltet)
.NET Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9 (Core 1.0)
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.1, 2.0, 2.1 (1.2, 1.3, 1.4, 1.5, 1.6)
UWP (10.0)

PtrToStructure(IntPtr, Type)

Quelle:
Marshal.cs
Quelle:
Marshal.cs
Quelle:
Marshal.cs

Achtung

PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513

Marshallt Daten aus einem nicht verwalteten Speicherblock zu einem neu belegten, verwalteten Objekt des angegebenen Typs.

C#
[System.Obsolete("PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513")]
[System.Security.SecurityCritical]
public static object PtrToStructure (IntPtr ptr, Type structureType);
C#
public static object? PtrToStructure (IntPtr ptr, Type structureType);
C#
[System.Security.SecurityCritical]
public static object PtrToStructure (IntPtr ptr, Type structureType);
C#
public static object PtrToStructure (IntPtr ptr, Type structureType);
C#
[System.Runtime.InteropServices.ComVisible(true)]
public static object PtrToStructure (IntPtr ptr, Type structureType);
C#
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static object PtrToStructure (IntPtr ptr, Type structureType);

Parameter

ptr
IntPtr

Ein Zeiger auf einen nicht verwalteten Speicherblock.

structureType
Type

Der Typ des zu erstellenden Objekts. Dieses Objekt muss eine formatierte Klasse oder eine Struktur darstellen.

Gibt zurück

Ein verwaltetes Objekt mit Daten, auf die der ptr-Parameter zeigt.

Attribute

Ausnahmen

Das structureType-Parameterlayout ist weder sequenziell noch explizit.

- oder -

Der structureType-Parameter ist eine generische Typdefinition.

structureType ist null.

Die von structureType angegebene Klasse besitzt keinen zugänglichen parameterlosen Konstruktor.

Beispiele

Im folgenden Beispiel wird eine verwaltete Struktur erstellt, in den nicht verwalteten Arbeitsspeicher übertragen und dann mithilfe der -Methode wieder in den PtrToStructure verwalteten Arbeitsspeicher übertragen.

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

Im folgenden Beispiel wird veranschaulicht, wie sie einen nicht verwalteten Speicherblock mithilfe der -Methode in eine verwaltete Struktur marshallen PtrToStructure .

Wichtig

Dieser Code setzt eine 32-Bit-Kompilierung voraus. Ersetzen Sie vor der Verwendung eines 64-Bit-Compilers IntPtr.ToInt32 durch IntPtr.ToInt64.

C#

        [StructLayout(LayoutKind.Sequential)]

        public class  INNER

        {

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]

            public string field1 = "Test";
        }	

        [StructLayout(LayoutKind.Sequential)]

        public struct OUTER

        {

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]

            public string field1;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst =  100)]

            public byte[] inner;
        }
        [DllImport(@"SomeTestDLL.dll")]

        public static extern void CallTest( ref OUTER po);
        static void Main(string[] args)

        {

            OUTER ed = new OUTER();

            INNER[] inn=new INNER[10];

            INNER test = new INNER();

            int iStructSize = Marshal.SizeOf(test);
            int sz =inn.Length * iStructSize;

            ed.inner = new byte[sz];
            try

            {

                CallTest( ref ed);
            }

            catch(Exception e)

            {

                Console.WriteLine(e.Message);
            }

            IntPtr buffer = Marshal.AllocCoTaskMem(iStructSize*10);

            Marshal.Copy(ed.inner,0,buffer,iStructSize*10);
            int iCurOffset = 0;

            for(int i=0;i<10;i++)

            {
                inn[i] = (INNER)Marshal.PtrToStructure(new
IntPtr(buffer.ToInt32()+iCurOffset),typeof(INNER) );

                iCurOffset += iStructSize;
            }

            Console.WriteLine(ed.field1);

            Marshal.FreeCoTaskMem(buffer);
        }

Hinweise

PtrToStructure ist häufig in COM-Interop- und Plattformaufrufen erforderlich, wenn Strukturparameter als System.IntPtr Wert dargestellt werden. Sie können einen Werttyp an diese Überladungsmethode übergeben. In diesem Fall ist das zurückgegebene Objekt eine Boxinstanz. Wenn der ptr Parameter gleich IntPtr.Zeroist, null wird zurückgegeben.

Weitere Informationen

Gilt für:

.NET 9 und andere Versionen
Produkt Versionen (Veraltet)
.NET Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9 (Core 1.0)
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.1, 2.0, 2.1 (1.2, 1.3, 1.4, 1.5, 1.6)
UWP (10.0)

PtrToStructure<T>(IntPtr)

Quelle:
Marshal.cs
Quelle:
Marshal.cs
Quelle:
Marshal.cs

Marshallt Daten aus einem nicht verwalteten Speicherblock zu einem neu belegten, verwalteten Objekt des von einem generischen Typparameter angegebenen Typs.

C#
[System.Security.SecurityCritical]
public static T PtrToStructure<T> (IntPtr ptr);
C#
public static T? PtrToStructure<T> (IntPtr ptr);
C#
public static T PtrToStructure<T> (IntPtr ptr);

Typparameter

T

Der Typ des Objekts, in das die Daten kopiert werden sollen. Dies muss eine formatierte Klasse oder eine Struktur sein.

Parameter

ptr
IntPtr

Ein Zeiger auf einen nicht verwalteten Speicherblock.

Gibt zurück

T

Ein verwaltetes Objekt mit Daten, auf die der ptr-Parameter zeigt.

Attribute

Ausnahmen

Das Layout von Tist weder sequenziell noch explizit.

Die von T angegebene Klasse besitzt keinen zugänglichen parameterlosen Konstruktor.

Hinweise

PtrToStructure<T>(IntPtr) ist häufig in COM-Interop- und Plattformaufrufen erforderlich, wenn Strukturparameter als System.IntPtr Werte dargestellt werden. Sie können einen Werttyp an diese Methodenüberladung übergeben. Wenn der ptr Parameter gleich IntPtr.Zero und T ein Verweistyp ist, null wird zurückgegeben. Wenn ptr gleich IntPtr.Zero und T ein Werttyp ist, wird ein NullReferenceException ausgelöst.

Gilt für:

.NET 9 und andere Versionen
Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

PtrToStructure<T>(IntPtr, T)

Quelle:
Marshal.cs
Quelle:
Marshal.cs
Quelle:
Marshal.cs

Marshallt Daten aus einem nicht verwalteten Speicherblock zu einem verwalteten Objekt eines festgelegten Typs.

C#
[System.Security.SecurityCritical]
public static void PtrToStructure<T> (IntPtr ptr, T structure);
C#
public static void PtrToStructure<T> (IntPtr ptr, T structure);

Typparameter

T

Der structure-Typ. Muss eine formatierte Klasse sein.

Parameter

ptr
IntPtr

Ein Zeiger auf einen nicht verwalteten Speicherblock.

structure
T

Das Objekt, in das die Daten kopiert werden sollen.

Attribute

Ausnahmen

Das Strukturlayout ist weder sequenziell noch explizit.

Hinweise

PtrToStructure<T>(IntPtr, T) ist häufig in COM-Interop- und Plattformaufrufen erforderlich, wenn Strukturparameter als IntPtr Werte dargestellt werden. Sie können diese Methodenüberladung nicht mit Werttypen verwenden. Wenn der ptr Parameter gleich IntPtr.Zero und T ein Verweistyp ist, null wird zurückgegeben. Wenn ptr gleich IntPtr.Zero und T ein Werttyp ist, wird ein NullReferenceException ausgelöst.

Gilt für:

.NET 9 und andere Versionen
Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0