Sdílet prostřednictvím


Marshal.StructureToPtr Metoda

Definice

Přetížení

StructureToPtr(Object, IntPtr, Boolean)
Zastaralé.

Zařadí data ze spravovaného objektu do nespravovaného bloku paměti.

StructureToPtr<T>(T, IntPtr, Boolean)

Zařadí data ze spravovaného objektu zadaného typu do nespravovaného bloku paměti.

StructureToPtr(Object, IntPtr, Boolean)

Zdroj:
Marshal.cs
Zdroj:
Marshal.cs
Zdroj:
Marshal.CoreCLR.cs

Upozornění

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

Zařadí data ze spravovaného objektu do nespravovaného bloku paměti.

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

Spravovaný objekt, který obsahuje data, která mají být zařazována. Tento objekt musí být strukturou nebo instancí formátované třídy.

ptr
IntPtr

nativeint

Ukazatel na nespravovaný blok paměti, který musí být přidělen před zavoláním této metody.

fDeleteOld
Boolean

true pro volání DestroyStructure(IntPtr, Type) metody parametru ptr před tím, než tato metoda zkopíruje data. Blok musí obsahovat platná data. Všimněte si, že předání false , pokud blok paměti již obsahuje data, může vést k nevrácení paměti.

Atributy

Výjimky

structure je odkazový typ, který není formátovanou třídou.

-nebo-

structure je instance obecného typu (pouze v rozhraní .NET Framework 4.5 a starších verzích).

Příklady

Následující příklad vytvoří spravovanou strukturu, přenese ji do nespravované paměti pomocí StructureToPtr metody a pak ji pomocí metody přenese zpět do spravované paměti PtrToStructure .

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

Poznámky

Pokud structure je typ hodnoty, může být v rámečku nebo rozbalený. Pokud je v rámečku, před kopírováním se rozbalí.

Formátovaná třída je odkazový typ, jehož rozložení je určeno atributem StructLayoutAttribute jako nebo LayoutKind.ExplicitLayoutKind.Sequential.

StructureToPtr zkopíruje obsah structure do předem přiděleného bloku paměti, na ptr který parametr odkazuje. Pokud structure obsahuje odkazové typy, které jsou zařazovány na ukazatele rozhraní MODELU COM (rozhraní, třídy bez rozložení a System.Object), spravované objekty jsou zachovány s počtem odkazů. Všechny ostatní odkazové typy (například řetězce a pole) jsou zařazovány do kopií. Chcete-li uvolnit tyto spravované nebo nespravované objekty, je nutné volat metodu Marshal.DestroyStructure před uvolněním bloku paměti.

Pokud později použijete metodu StructureToPtr ke zkopírování jiné instance do bloku paměti, zadejte true for fDeleteOld , chcete-li odebrat počty odkazů pro odkazové typy v předchozí instanci. V opačném případě dochází k úniku spravovaných typů odkazů a nespravovaných kopií.

Celkový vzor použití StructureToPtr je následující:

  1. Při prvním volání StructureToPtr metody po přidělení fDeleteOld bloku paměti musí být false, protože neexistuje žádný obsah k vymazání.

    Důležité

    Zadejte true pouze v fDeleteOld případě, že blok obsahuje platná data.

  2. Pokud kopírujete jinou instanci do bloku paměti a objekt obsahuje odkazové typy, fDeleteOld musí být true volné odkazové typy ve starém obsahu.

  3. Pokud objekt obsahuje odkazové typy, je nutné volat metodu DestroyStructure před uvolněním bloku paměti.

Poznámka

Pokud chcete připnout existující strukturu místo kopírování, použijte System.Runtime.InteropServices.GCHandle typ k vytvoření připnutého úchytu pro strukturu. Podrobnosti o tom, jak připnout, najdete v tématu Kopírování a připnutí.

Viz také

Platí pro

StructureToPtr<T>(T, IntPtr, Boolean)

Zdroj:
Marshal.cs
Zdroj:
Marshal.cs
Zdroj:
Marshal.cs

Zařadí data ze spravovaného objektu zadaného typu do nespravovaného bloku paměti.

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 spravovaného objektu.

Parametry

structure
T

Spravovaný objekt, který obsahuje data, která mají být zařazována. Objekt musí být strukturou nebo instancí formátované třídy.

ptr
IntPtr

nativeint

Ukazatel na nespravovaný blok paměti, který musí být přidělen před zavoláním této metody.

fDeleteOld
Boolean

true pro volání DestroyStructure<T>(IntPtr) metody parametru ptr před tím, než tato metoda zkopíruje data. Blok musí obsahovat platná data. Všimněte si, že předání false , pokud blok paměti již obsahuje data, může vést k nevrácení paměti.

Atributy

Výjimky

structure je odkazový typ, který není formátovanou třídou.

Poznámky

Formátovaná třída je odkazový typ, jehož rozložení je určeno atributem StructLayoutAttribute jako nebo LayoutKind.ExplicitLayoutKind.Sequential.

StructureToPtr<T>(T, IntPtr, Boolean) zkopíruje obsah structure do předem přiděleného bloku paměti, na ptr který parametr odkazuje. Pokud structure obsahuje odkazové typy, které jsou zařazovány na ukazatele rozhraní MODELU COM (rozhraní, třídy bez rozložení a System.Object), spravované objekty jsou zachovány s počtem odkazů. Všechny ostatní odkazové typy (například řetězce a pole) jsou zařazovány do kopií. Chcete-li uvolnit tyto spravované nebo nespravované objekty, je nutné volat metodu DestroyStructure<T>(IntPtr) před uvolněním bloku paměti.

Pokud později použijete metodu StructureToPtr<T>(T, IntPtr, Boolean) ke zkopírování jiné instance do bloku paměti, zadejte true for fDeleteOld , chcete-li odebrat počty odkazů pro odkazové typy v předchozí instanci. V opačném případě dochází k úniku spravovaných typů odkazů a nespravovaných kopií.

Celkový vzor použití StructureToPtr<T>(T, IntPtr, Boolean) je následující:

  1. Při prvním volání StructureToPtr metody po přidělení fDeleteOld bloku paměti musí být false, protože neexistuje žádný obsah k vymazání.

    Důležité

    Zadejte true pouze v fDeleteOld případě, že blok obsahuje platná data.

  2. Pokud kopírujete jinou instanci do bloku paměti a objekt obsahuje odkazové typy, fDeleteOld musí být true volné odkazové typy ve starém obsahu.

  3. Pokud objekt obsahuje odkazové typy, je nutné volat metodu DestroyStructure před uvolněním bloku paměti.

Poznámka

Pokud chcete připnout existující strukturu místo kopírování, použijte System.Runtime.InteropServices.GCHandle typ k vytvoření připnutého úchytu pro strukturu. Podrobnosti o tom, jak připnout, najdete v tématu Kopírování a připnutí.

Viz také

Platí pro