Udostępnij za pośrednictwem


Marshal.StructureToPtr Metoda

Definicja

Przeciążenia

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

Marshaluje 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

Marshaluje 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ć, zanim zostanie wywołana ta metoda.

fDeleteOld
Boolean

true aby wywołać metodę DestroyStructure(IntPtr, Type) na parametrze 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-

structurejest wystąpieniem typu ogólnego (tylko w .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 metody , a następnie przesyła ją z powrotem do pamięci zarządzanej PtrToStructure przy StructureToPtr 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że być pola lub rozpakowany. Jeśli jest ona w polu, jest ona rozpakowana przed skopiowaniem.

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

StructureToPtr kopiuje zawartość structure do wstępnie przydzielonego bloku pamięci, do którego ptr wskazuje parametr. Jeśli structure zawiera typy odwołań do wskaźników interfejsu COM (interfejsów, klas bez układu i System.Object), zarządzane obiekty są zachowywane przy użyciu liczby odwołań. Wszystkie inne typy odwołań (na przykład ciągi i tablice) są marshalowane 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 , aby fDeleteOld usunąć liczby odwołań dla typów referencyjnych w poprzednim wystąpieniu. W przeciwnym razie zarządzane typy odwołań i niezarządzane kopie są skutecznie wyciekane.

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

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

    Ważne

    Określ true wartość 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 należy zwolnić true typy 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ć, zanim zostanie wywołana ta metoda.

fDeleteOld
Boolean

true aby wywołać metodę DestroyStructure<T>(IntPtr) na parametrze 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 jako LayoutKind.Explicit lub LayoutKind.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 odwołań do wskaźników interfejsu COM (interfejsów, klas bez układu i System.Object), zarządzane obiekty są zachowywane przy użyciu liczby odwołań. Wszystkie inne typy odwołań (na przykład ciągi i tablice) są marshalowane 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 , aby fDeleteOld usunąć liczby odwołań dla typów referencyjnych w poprzednim wystąpieniu. W przeciwnym razie zarządzane typy odwołań i niezarządzane kopie są skutecznie wyciekane.

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

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

    Ważne

    Określ true wartość 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 należy zwolnić true typy 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