Marshal.StructureToPtr Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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í:
Při prvním volání StructureToPtr metody po přidělení
fDeleteOld
bloku paměti musí býtfalse
, protože neexistuje žádný obsah k vymazání.Důležité
Zadejte
true
pouze vfDeleteOld
případě, že blok obsahuje platná data.Pokud kopírujete jinou instanci do bloku paměti a objekt obsahuje odkazové typy,
fDeleteOld
musí býttrue
volné odkazové typy ve starém obsahu.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í:
Při prvním volání StructureToPtr metody po přidělení
fDeleteOld
bloku paměti musí býtfalse
, protože neexistuje žádný obsah k vymazání.Důležité
Zadejte
true
pouze vfDeleteOld
případě, že blok obsahuje platná data.Pokud kopírujete jinou instanci do bloku paměti a objekt obsahuje odkazové typy,
fDeleteOld
musí býttrue
volné odkazové typy ve starém obsahu.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í.