Bagikan melalui


Marshal.StructureToPtr Metode

Definisi

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:

  1. Pada panggilan pertama ke StructureToPtr metode setelah blok memori dialokasikan, fDeleteOld harus false, karena tidak ada konten yang harus dihapus.

    Penting

    fDeleteOld Tentukan true hanya jika blok berisi data yang valid.

  2. Jika Anda menyalin instans yang berbeda ke blok memori, dan objek berisi jenis referensi, fDeleteOld harus true untuk membebaskan jenis referensi dalam konten lama.

  3. 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:

  1. Pada panggilan pertama ke StructureToPtr metode setelah blok memori dialokasikan, fDeleteOld harus false, karena tidak ada konten yang harus dihapus.

    Penting

    fDeleteOld Tentukan true hanya jika blok berisi data yang valid.

  2. Jika Anda menyalin instans yang berbeda ke blok memori, dan objek berisi jenis referensi, fDeleteOld harus true untuk membebaskan jenis referensi dalam konten lama.

  3. 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