Бөлісу құралы:


Marshal.StructureToPtr Метод

Определение

Перегрузки

StructureToPtr(Object, IntPtr, Boolean)
Устаревшие..

Маршалирует данные из управляемого объекта в неуправляемый блок памяти.

StructureToPtr<T>(T, IntPtr, Boolean)

Выполняет маршалирование данных в неуправляемый блока памяти из управляемого объекта указанного типа.

StructureToPtr(Object, IntPtr, Boolean)

Исходный код:
Marshal.cs
Исходный код:
Marshal.cs
Исходный код:
Marshal.CoreCLR.cs

Внимание!

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

Маршалирует данные из управляемого объекта в неуправляемый блок памяти.

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)

Параметры

structure
Object

Управляемый объект, содержащий данные для маршалинга. Этот объект должен представлять собой структуру или экземпляр форматированного класса.

ptr
IntPtr

nativeint

Указатель на неуправляемый блок памяти, который должен быть выделен перед вызовом метода.

fDeleteOld
Boolean

Значение true для вызова метода DestroyStructure(IntPtr, Type) в параметре ptr перед тем, как этот метод скопирует данные. Блок должен содержать допустимые данные. Обратите внимание, что передача значения false, когда блок памяти уже содержит данные, может привести к утечке памяти.

Атрибуты

Исключения

structure — это ссылочный тип, который не является форматированным классом.

-или-

structure — это экземпляр универсального типа (только в .NET Framework 4.5 и более ранних версиях).

Примеры

В следующем примере создается управляемая структура, она передается в неуправляемую память с помощью StructureToPtr метода , а затем передается обратно в управляемую 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

Комментарии

Если structure является типом значения, оно может быть упаковано или распаковано. Если она упакована, перед копированием она распаковкается.

Форматированный класс — это ссылочный тип, макет которого задается атрибутом StructLayoutAttribute в виде LayoutKind.Explicit или LayoutKind.Sequential.

StructureToPtr копирует содержимое в structure предварительно выделенный блок памяти, на который ptr указывает параметр. Если structure содержит ссылочные типы, маршалирующие в указатели интерфейса COM (интерфейсы, классы без макета и System.Object), управляемые объекты сохраняются в активном состоянии с количеством ссылок. Все остальные ссылочные типы (например, строки и массивы) маршалируются в копии. Чтобы освободить эти управляемые или неуправляемые объекты, необходимо вызвать Marshal.DestroyStructure метод перед освобождением блока памяти.

Если вы используете StructureToPtr метод для последующего копирования другого экземпляра в блок памяти, укажите true для fDeleteOld , чтобы удалить количество ссылок для ссылочных типов в предыдущем экземпляре. В противном случае будут фактически утечка управляемых ссылочных типов и неуправляемых копий.

Общий шаблон использования StructureToPtr выглядит следующим образом:

  1. При первом вызове StructureToPtr метода после выделения fDeleteOld блока памяти должен иметь значение false, так как содержимое для очистки отсутствует.

    Важно!

    Укажите true для fDeleteOld , только если блок содержит допустимые данные.

  2. Если вы копируете другой экземпляр в блок памяти, а объект содержит ссылочные типы, fDeleteOld необходимо true освободить ссылочные типы в старом содержимом.

  3. Если объект содержит ссылочные типы, необходимо вызвать DestroyStructure метод перед освобождением блока памяти.

Примечание

Чтобы закрепить существующую структуру вместо ее копирования, используйте System.Runtime.InteropServices.GCHandle тип для создания закрепленного дескриптора для структуры. Дополнительные сведения о том, как закрепить, см. в разделе Копирование и закрепление.

См. также раздел

Применяется к

StructureToPtr<T>(T, IntPtr, Boolean)

Исходный код:
Marshal.cs
Исходный код:
Marshal.cs
Исходный код:
Marshal.cs

Выполняет маршалирование данных в неуправляемый блока памяти из управляемого объекта указанного типа.

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)

Параметры типа

T

Тип управляемого объекта.

Параметры

structure
T

Управляемый объект, содержащий данные для маршалинга. Объект должен представлять собой структуру или экземпляр форматированного класса.

ptr
IntPtr

nativeint

Указатель на неуправляемый блок памяти, который должен быть выделен перед вызовом метода.

fDeleteOld
Boolean

Значение true для вызова метода DestroyStructure<T>(IntPtr) в параметре ptr перед тем, как этот метод скопирует данные. Блок должен содержать допустимые данные. Обратите внимание, что передача значения false, когда блок памяти уже содержит данные, может привести к утечке памяти.

Атрибуты

Исключения

structure — это ссылочный тип, который не является форматированным классом.

Комментарии

Форматированный класс — это ссылочный тип, макет которого задается атрибутом StructLayoutAttribute в виде LayoutKind.Explicit или LayoutKind.Sequential.

StructureToPtr<T>(T, IntPtr, Boolean) копирует содержимое в structure предварительно выделенный блок памяти, на который ptr указывает параметр. Если structure содержит ссылочные типы, маршалирующие в указатели интерфейса COM (интерфейсы, классы без макета и System.Object), управляемые объекты сохраняются в активном состоянии с количеством ссылок. Все остальные ссылочные типы (например, строки и массивы) маршалируются в копии. Чтобы освободить эти управляемые или неуправляемые объекты, необходимо вызвать DestroyStructure<T>(IntPtr) метод перед освобождением блока памяти.

Если вы используете StructureToPtr<T>(T, IntPtr, Boolean) метод для последующего копирования другого экземпляра в блок памяти, укажите true для fDeleteOld , чтобы удалить количество ссылок для ссылочных типов в предыдущем экземпляре. В противном случае будут фактически утечка управляемых ссылочных типов и неуправляемых копий.

Общий шаблон использования StructureToPtr<T>(T, IntPtr, Boolean) выглядит следующим образом:

  1. При первом вызове StructureToPtr метода после выделения fDeleteOld блока памяти должен иметь значение false, так как содержимое для очистки отсутствует.

    Важно!

    Укажите true для fDeleteOld , только если блок содержит допустимые данные.

  2. Если вы копируете другой экземпляр в блок памяти, а объект содержит ссылочные типы, fDeleteOld необходимо true освободить ссылочные типы в старом содержимом.

  3. Если объект содержит ссылочные типы, необходимо вызвать DestroyStructure метод перед освобождением блока памяти.

Примечание

Чтобы закрепить существующую структуру вместо ее копирования, используйте System.Runtime.InteropServices.GCHandle тип для создания закрепленного дескриптора для структуры. Дополнительные сведения о том, как закрепить, см. в разделе Копирование и закрепление.

См. также раздел

Применяется к