Marshal.StructureToPtr Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Overload
StructureToPtr(Object, IntPtr, Boolean) |
Kedaluwarsa.
Marsekal data dari objek terkelola ke blok memori yang tidak dikelola. |
StructureToPtr<T>(T, IntPtr, Boolean) |
Marsekal data dari objek terkelola dari jenis tertentu ke blok memori yang tidak dikelola. |
StructureToPtr(Object, IntPtr, Boolean)
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.CoreCLR.cs
Perhatian
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
Marsekal data dari objek terkelola ke blok memori yang tidak dikelola.
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)
Parameter
- structure
- Object
Objek terkelola yang menyimpan data untuk dijadikan marshal. Objek ini harus berupa struktur atau instans kelas yang diformat.
- ptr
-
IntPtr
nativeint
Penunjuk ke blok memori yang tidak dikelola, yang harus dialokasikan sebelum metode ini dipanggil.
- fDeleteOld
- Boolean
true
untuk memanggil DestroyStructure(IntPtr, Type) metode pada ptr
parameter sebelum metode ini menyalin data. Blok harus berisi data yang valid. Perhatikan bahwa melewati false
ketika blok memori sudah berisi data dapat menyebabkan kebocoran memori.
- Atribut
Pengecualian
structure
adalah jenis referensi yang bukan kelas yang diformat.
-atau-
structure
adalah instans jenis generik (hanya dalam .NET Framework 4.5 dan versi yang lebih lama).
Contoh
Contoh berikut membuat struktur terkelola, mentransfernya ke memori yang tidak dikelola menggunakan StructureToPtr metode , lalu mentransfernya kembali ke memori terkelola PtrToStructure menggunakan metode .
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
Keterangan
Jika structure
adalah jenis nilai, itu bisa dikotak atau tidak dikotak. Jika dikotak, kotak tersebut tidak dikotak sebelum disalin.
Kelas yang diformat adalah jenis referensi yang tata letaknya ditentukan oleh StructLayoutAttribute atribut , sebagai LayoutKind.Explicit atau LayoutKind.Sequential.
StructureToPtr menyalin konten structure
ke blok memori yang telah dialokasikan sebelumnya yang dirujuk ptr
parameter. Jika structure
berisi jenis referensi yang marsekal ke penunjuk antarmuka COM (antarmuka, kelas tanpa tata letak, dan System.Object), objek terkelola tetap hidup dengan jumlah referensi. Semua jenis referensi lainnya (misalnya, string dan array) di-marshalasikan ke salinan. Untuk merilis objek terkelola atau tidak terkelola ini, Anda harus memanggil Marshal.DestroyStructure metode sebelum membebaskan blok memori.
Jika Anda menggunakan StructureToPtr metode untuk menyalin instans yang berbeda ke blok memori di lain waktu, tentukan true
untuk fDeleteOld
menghapus jumlah referensi untuk jenis referensi di instans sebelumnya. Jika tidak, jenis referensi terkelola dan salinan yang tidak dikelola bocor secara efektif.
Pola keseluruhan untuk digunakan StructureToPtr adalah sebagai berikut:
Pada panggilan pertama ke StructureToPtr metode setelah blok memori dialokasikan,
fDeleteOld
harusfalse
, karena tidak ada konten yang harus dihapus.Penting
fDeleteOld
Tentukantrue
hanya jika blok berisi data yang valid.Jika Anda menyalin instans yang berbeda ke blok memori, dan objek berisi jenis referensi,
fDeleteOld
harustrue
untuk membebaskan jenis referensi dalam konten lama.Jika objek berisi jenis referensi, Anda harus memanggil DestroyStructure metode sebelum membebaskan blok memori.
Catatan
Untuk menyematkan struktur yang ada alih-alih menyalinnya, gunakan System.Runtime.InteropServices.GCHandle jenis untuk membuat handel yang disematkan untuk struktur. Untuk detail tentang cara menyematkan, lihat Menyalin dan Menyematkan.
Lihat juga
Berlaku untuk
StructureToPtr<T>(T, IntPtr, Boolean)
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
Marsekal data dari objek terkelola dari jenis tertentu ke blok memori yang tidak dikelola.
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)
Jenis parameter
- T
Jenis objek terkelola.
Parameter
- structure
- T
Objek terkelola yang menyimpan data untuk dijadikan marshal. Objek harus berupa struktur atau instans kelas yang diformat.
- ptr
-
IntPtr
nativeint
Penunjuk ke blok memori yang tidak dikelola, yang harus dialokasikan sebelum metode ini dipanggil.
- fDeleteOld
- Boolean
true
untuk memanggil DestroyStructure<T>(IntPtr) metode pada ptr
parameter sebelum metode ini menyalin data. Blok harus berisi data yang valid. Perhatikan bahwa melewati false
ketika blok memori sudah berisi data dapat menyebabkan kebocoran memori.
- Atribut
Pengecualian
structure
adalah jenis referensi yang bukan kelas yang diformat.
Keterangan
Kelas yang diformat adalah jenis referensi yang tata letaknya ditentukan oleh StructLayoutAttribute atribut , sebagai LayoutKind.Explicit atau LayoutKind.Sequential.
StructureToPtr<T>(T, IntPtr, Boolean) menyalin konten structure
ke blok memori yang telah dialokasikan sebelumnya yang dirujuk ptr
parameter. Jika structure
berisi jenis referensi yang marsekal ke penunjuk antarmuka COM (antarmuka, kelas tanpa tata letak, dan System.Object), objek terkelola tetap hidup dengan jumlah referensi. Semua jenis referensi lainnya (misalnya, string dan array) di-marshalasikan ke salinan. Untuk merilis objek terkelola atau tidak terkelola ini, Anda harus memanggil DestroyStructure<T>(IntPtr) metode sebelum membebaskan blok memori.
Jika Anda menggunakan StructureToPtr<T>(T, IntPtr, Boolean) metode untuk menyalin instans yang berbeda ke blok memori di lain waktu, tentukan true
untuk fDeleteOld
menghapus jumlah referensi untuk jenis referensi di instans sebelumnya. Jika tidak, jenis referensi terkelola dan salinan yang tidak dikelola bocor secara efektif.
Pola keseluruhan untuk digunakan StructureToPtr<T>(T, IntPtr, Boolean) adalah sebagai berikut:
Pada panggilan pertama ke StructureToPtr metode setelah blok memori dialokasikan,
fDeleteOld
harusfalse
, karena tidak ada konten yang harus dihapus.Penting
fDeleteOld
Tentukantrue
hanya jika blok berisi data yang valid.Jika Anda menyalin instans yang berbeda ke blok memori, dan objek berisi jenis referensi,
fDeleteOld
harustrue
untuk membebaskan jenis referensi dalam konten lama.Jika objek berisi jenis referensi, Anda harus memanggil DestroyStructure metode sebelum membebaskan blok memori.
Catatan
Untuk menyematkan struktur yang ada alih-alih menyalinnya, gunakan System.Runtime.InteropServices.GCHandle jenis untuk membuat handel yang disematkan untuk struktur. Untuk detail tentang cara menyematkan, lihat Menyalin dan Menyematkan.