Marshal.StructureToPtr Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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:
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 wtedyfDeleteOld
, gdy blok zawiera prawidłowe dane.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.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:
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 wtedyfDeleteOld
, gdy blok zawiera prawidłowe dane.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.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.