Udostępnij za pośrednictwem


Marshal.StructureToPtr Metoda

Definicja

Przeciążenia

StructureToPtr(Object, IntPtr, Boolean)
Przestarzałe.

Organizuje dane z zarządzanego obiektu do niezarządzanego bloku pamięci.

StructureToPtr<T>(T, IntPtr, Boolean)

Marshaluje dane z zarządzanego obiektu określonego typu do niezarządzanego bloku pamięci.

StructureToPtr(Object, IntPtr, Boolean)

Źródło:
Marshal.cs
Źródło:
Marshal.cs
Źródło:
Marshal.CoreCLR.cs

Przestroga

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

Organizuje dane z zarządzanego obiektu do niezarządzanego bloku pamięci.

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)

Parametry

structure
Object

Zarządzany obiekt, który przechowuje dane do marshalingu. Ten obiekt musi być strukturą lub wystąpieniem sformatowanej klasy.

ptr
IntPtr

nativeint

Wskaźnik do niezarządzanego bloku pamięci, który należy przydzielić przed wywołaniem tej metody.

fDeleteOld
Boolean

true aby wywołać metodę dla parametru DestroyStructure(IntPtr, Type)ptr przed skopiowaniem danych przez tę metodę. Blok musi zawierać prawidłowe dane. Należy pamiętać, że przekazywanie false , gdy blok pamięci zawiera już dane, może prowadzić do wycieku pamięci.

Atrybuty

Wyjątki

structure to typ odwołania, który nie jest sformatowaną klasą.

-lub-

structure jest wystąpieniem typu ogólnego (tylko w programie .NET Framework 4.5 i starszych wersjach).

Przykłady

Poniższy przykład tworzy strukturę zarządzaną, przesyła ją do niezarządzanej pamięci przy użyciu StructureToPtr metody , a następnie przesyła ją z powrotem do pamięci zarządzanej PtrToStructure przy użyciu metody .

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

Uwagi

Jeśli structure jest typem wartości, można ją polecić lub rozpakować. Jeśli jest on skrzynkowy, jest rozpakowany przed skopiowaniem.

Sformatowana klasa jest typem odwołania, którego układ jest określony przez StructLayoutAttribute atrybut lub LayoutKind.ExplicitLayoutKind.Sequential.

StructureToPtr kopiuje zawartość structure do wstępnie przydzielonego bloku pamięci, do którego ptr wskazuje parametr . Jeśli structure zawiera typy referencyjne, które prowadzą do wskaźników interfejsu COM (interfejsy, klasy bez układu i System.Object), zarządzane obiekty są utrzymywane przy życiu z liczbami odwołań. Wszystkie inne typy odwołań (na przykład ciągi i tablice) są marshalingowe do kopii. Aby zwolnić te zarządzane lub niezarządzane obiekty, należy wywołać metodę Marshal.DestroyStructure przed zwolnieniem bloku pamięci.

Jeśli używasz StructureToPtr metody do kopiowania innego wystąpienia do bloku pamięci w późniejszym czasie, określ true parametr fDeleteOld , aby usunąć liczbę odwołań dla typów odwołań w poprzednim wystąpieniu. W przeciwnym razie zarządzane typy odwołań i niezarządzane kopie zostaną skutecznie ujawnione.

Ogólny wzorzec użycia StructureToPtr jest następujący:

  1. Przy pierwszym wywołaniu StructureToPtr metody po przydzieleniu fDeleteOld bloku pamięci musi być false, ponieważ nie ma zawartości do wyczyszczenia.

    Ważne

    Określ true parametr tylko wtedy fDeleteOld , gdy blok zawiera prawidłowe dane.

  2. Jeśli skopiujesz inne wystąpienie do bloku pamięci, a obiekt zawiera typy referencyjne, fDeleteOld musi być true wolnych typów odwołań w starej zawartości.

  3. Jeśli obiekt zawiera typy odwołań, należy wywołać metodę DestroyStructure przed zwolnieniem bloku pamięci.

Uwaga

Aby przypiąć istniejącą strukturę zamiast jej skopiować, użyj System.Runtime.InteropServices.GCHandle typu , aby utworzyć przypięty uchwyt dla struktury. Aby uzyskać szczegółowe informacje na temat przypinania, zobacz Kopiowanie i przypinanie.

Zobacz też

Dotyczy

StructureToPtr<T>(T, IntPtr, Boolean)

Źródło:
Marshal.cs
Źródło:
Marshal.cs
Źródło:
Marshal.cs

Marshaluje dane z zarządzanego obiektu określonego typu do niezarządzanego bloku pamięci.

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)

Parametry typu

T

Typ obiektu zarządzanego.

Parametry

structure
T

Zarządzany obiekt, który przechowuje dane do marshalingu. Obiekt musi być strukturą lub wystąpieniem sformatowanej klasy.

ptr
IntPtr

nativeint

Wskaźnik do niezarządzanego bloku pamięci, który należy przydzielić przed wywołaniem tej metody.

fDeleteOld
Boolean

true aby wywołać metodę dla parametru DestroyStructure<T>(IntPtr)ptr przed skopiowaniem danych przez tę metodę. Blok musi zawierać prawidłowe dane. Należy pamiętać, że przekazywanie false , gdy blok pamięci zawiera już dane, może prowadzić do wycieku pamięci.

Atrybuty

Wyjątki

structure to typ odwołania, który nie jest sformatowaną klasą.

Uwagi

Sformatowana klasa jest typem odwołania, którego układ jest określony przez StructLayoutAttribute atrybut lub LayoutKind.ExplicitLayoutKind.Sequential.

StructureToPtr<T>(T, IntPtr, Boolean) kopiuje zawartość structure do wstępnie przydzielonego bloku pamięci, do którego ptr wskazuje parametr . Jeśli structure zawiera typy referencyjne, które prowadzą do wskaźników interfejsu COM (interfejsy, klasy bez układu i System.Object), zarządzane obiekty są utrzymywane przy życiu z liczbami odwołań. Wszystkie inne typy odwołań (na przykład ciągi i tablice) są marshalingowe do kopii. Aby zwolnić te zarządzane lub niezarządzane obiekty, należy wywołać metodę DestroyStructure<T>(IntPtr) przed zwolnieniem bloku pamięci.

Jeśli używasz StructureToPtr<T>(T, IntPtr, Boolean) metody do kopiowania innego wystąpienia do bloku pamięci w późniejszym czasie, określ true parametr fDeleteOld , aby usunąć liczbę odwołań dla typów odwołań w poprzednim wystąpieniu. W przeciwnym razie zarządzane typy odwołań i niezarządzane kopie zostaną skutecznie ujawnione.

Ogólny wzorzec użycia StructureToPtr<T>(T, IntPtr, Boolean) jest następujący:

  1. Przy pierwszym wywołaniu StructureToPtr metody po przydzieleniu fDeleteOld bloku pamięci musi być false, ponieważ nie ma zawartości do wyczyszczenia.

    Ważne

    Określ true parametr tylko wtedy fDeleteOld , gdy blok zawiera prawidłowe dane.

  2. Jeśli skopiujesz inne wystąpienie do bloku pamięci, a obiekt zawiera typy referencyjne, fDeleteOld musi być true wolnych typów odwołań w starej zawartości.

  3. Jeśli obiekt zawiera typy odwołań, należy wywołać metodę DestroyStructure przed zwolnieniem bloku pamięci.

Uwaga

Aby przypiąć istniejącą strukturę zamiast jej skopiować, użyj System.Runtime.InteropServices.GCHandle typu , aby utworzyć przypięty uchwyt dla struktury. Aby uzyskać szczegółowe informacje na temat przypinania, zobacz Kopiowanie i przypinanie.

Zobacz też

Dotyczy