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 выглядит следующим образом:
При первом вызове StructureToPtr метода после выделения
fDeleteOld
блока памяти должен иметь значениеfalse
, так как содержимое для очистки отсутствует.Важно!
Укажите
true
дляfDeleteOld
, только если блок содержит допустимые данные.Если вы копируете другой экземпляр в блок памяти, а объект содержит ссылочные типы,
fDeleteOld
необходимоtrue
освободить ссылочные типы в старом содержимом.Если объект содержит ссылочные типы, необходимо вызвать 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) выглядит следующим образом:
При первом вызове StructureToPtr метода после выделения
fDeleteOld
блока памяти должен иметь значениеfalse
, так как содержимое для очистки отсутствует.Важно!
Укажите
true
дляfDeleteOld
, только если блок содержит допустимые данные.Если вы копируете другой экземпляр в блок памяти, а объект содержит ссылочные типы,
fDeleteOld
необходимоtrue
освободить ссылочные типы в старом содержимом.Если объект содержит ссылочные типы, необходимо вызвать DestroyStructure метод перед освобождением блока памяти.
Примечание
Чтобы закрепить существующую структуру вместо ее копирования, используйте System.Runtime.InteropServices.GCHandle тип для создания закрепленного дескриптора для структуры. Дополнительные сведения о том, как закрепить, см. в разделе Копирование и закрепление.