Marshal.StructureToPtr 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
重载
StructureToPtr(Object, IntPtr, Boolean) |
已过时.
将数据从托管对象封送到非托管内存块。 |
StructureToPtr<T>(T, IntPtr, Boolean) |
将数据从指定类型的托管对象封送到非托管内存块。 |
StructureToPtr(Object, IntPtr, Boolean)
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- 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
如果在此方法复制该数据前在 DestroyStructure(IntPtr, Type) 参数上调用 ptr
,则为 true
。 该块必须包含有效的数据。 请注意,在内存块已包含数据时传递 false
可能会导致内存泄漏。
- 属性
例外
示例
以下示例创建一个托管结构,使用 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
for fDeleteOld
以删除上一实例中引用类型的引用计数。 否则,托管引用类型和非托管副本将有效地泄漏。
使用 StructureToPtr 的总体模式如下所示:
在分配内存块后首次调用 StructureToPtr 方法时,
fDeleteOld
必须是false
,因为没有要清除的内容。重要
fDeleteOld
仅当块包含有效数据时,才为 指定true
。如果将其他实例复制到内存块,并且对象包含引用类型,
fDeleteOld
则必须为true
以释放旧内容中的引用类型。如果对象包含引用类型,则必须在释放内存块之前调用 DestroyStructure 方法。
注意
若要固定现有结构而不是复制它,请使用 System.Runtime.InteropServices.GCHandle 类型为结构创建固定的句柄。 有关如何固定的详细信息,请参阅 复制和固定。
另请参阅
适用于
StructureToPtr<T>(T, IntPtr, Boolean)
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- 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
如果在此方法复制该数据前在 DestroyStructure<T>(IntPtr) 参数上调用 ptr
,则为 true
。 该块必须包含有效的数据。 请注意,在内存块已包含数据时传递 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
for fDeleteOld
以删除上一实例中引用类型的引用计数。 否则,托管引用类型和非托管副本将有效地泄漏。
使用 StructureToPtr<T>(T, IntPtr, Boolean) 的总体模式如下所示:
在分配内存块后首次调用 StructureToPtr 方法时,
fDeleteOld
必须是false
,因为没有要清除的内容。重要
fDeleteOld
仅当块包含有效数据时,才为 指定true
。如果将其他实例复制到内存块,并且对象包含引用类型,
fDeleteOld
则必须为true
以释放旧内容中的引用类型。如果对象包含引用类型,则必须在释放内存块之前调用 DestroyStructure 方法。
注意
若要固定现有结构而不是复制它,请使用 System.Runtime.InteropServices.GCHandle 类型为结构创建固定的句柄。 有关如何固定的详细信息,请参阅 复制和固定。