Marshal.StructureToPtr メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
オーバーロード
StructureToPtr(Object, IntPtr, Boolean) |
古い.
マネージド オブジェクトからアンマネージド メモリ ブロックにデータをマーシャリングします。 |
StructureToPtr<T>(T, IntPtr, Boolean) |
指定した型のマネージド オブジェクトから、アンマネージド メモリ ブロックにデータをマーシャリングします。 |
StructureToPtr(Object, IntPtr, Boolean)
- ソース:
- Marshal.cs
- ソース:
- Marshal.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
このメソッドがデータをコピーする前に、ptr
パラメーターに対して DestroyStructure(IntPtr, Type) メソッドを呼び出す場合は true
。 ブロックには有効なデータを含める必要があります。 メモリ ブロックに既にデータが格納されているときに 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.SequentialとしてLayoutKind.Explicitレイアウトが指定された参照型です。
StructureToPtr は、 の内容 structure
を、パラメーターが指すメモリの事前割り当て済みブロックに ptr
コピーします。 COM インターフェイス ポインター (インターフェイス、レイアウトのないクラス、および System.Object) にマーシャリングする参照型が含まれている場合structure
、マネージド オブジェクトは参照カウントで維持されます。 その他のすべての参照型 (文字列や配列など) は、コピーにマーシャリングされます。 これらのマネージド オブジェクトまたはアンマネージド オブジェクトを解放するには、メモリ ブロックを解放する Marshal.DestroyStructure 前に メソッドを呼び出す必要があります。
メソッドを使用して別のStructureToPtrインスタンスを後でメモリ ブロックにコピーする場合は、 をfDeleteOld
指定true
して、前のインスタンスの参照型の参照カウントを削除します。 そうしないと、マネージド参照型とアンマネージド コピーが実質的にリークされます。
を使用 StructureToPtr するための全体的なパターンは次のとおりです。
メモリ ブロックが割り当てられた後のメソッドの StructureToPtr 最初の呼び出しでは、
fDeleteOld
は にするfalse
必要があります。クリアする内容がないためです。重要
ブロックに有効なデータが含まれている場合にのみ、 に を
fDeleteOld
指定true
します。別のインスタンスをメモリ ブロックにコピーし、オブジェクトに参照型が含まれている場合は、
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
このメソッドがデータをコピーする前に、ptr
パラメーターに対して DestroyStructure<T>(IntPtr) メソッドを呼び出す場合は true
。 ブロックには有効なデータを含める必要があります。 メモリ ブロックに既にデータが格納されているときに false
を渡すと、メモリ リークが発生する可能性があることに注意してください。
- 属性
例外
structure
は書式指定クラスではない参照型です。
注釈
書式設定されたクラスは、属性によって StructLayoutAttribute または LayoutKind.SequentialとしてLayoutKind.Explicitレイアウトが指定された参照型です。
StructureToPtr<T>(T, IntPtr, Boolean) は、 の内容 structure
を、パラメーターが指すメモリの事前割り当て済みブロックに ptr
コピーします。 COM インターフェイス ポインター (インターフェイス、レイアウトのないクラス、および System.Object) にマーシャリングする参照型が含まれている場合structure
、マネージド オブジェクトは参照カウントで維持されます。 その他のすべての参照型 (文字列や配列など) は、コピーにマーシャリングされます。 これらのマネージド オブジェクトまたはアンマネージド オブジェクトを解放するには、メモリ ブロックを解放する DestroyStructure<T>(IntPtr) 前に メソッドを呼び出す必要があります。
メソッドを使用して別のStructureToPtr<T>(T, IntPtr, Boolean)インスタンスを後でメモリ ブロックにコピーする場合は、 をfDeleteOld
指定true
して、前のインスタンスの参照型の参照カウントを削除します。 そうしないと、マネージド参照型とアンマネージド コピーが実質的にリークされます。
を使用 StructureToPtr<T>(T, IntPtr, Boolean) するための全体的なパターンは次のとおりです。
メモリ ブロックが割り当てられた後のメソッドの StructureToPtr 最初の呼び出しでは、
fDeleteOld
は にするfalse
必要があります。クリアする内容がないためです。重要
ブロックに有効なデータが含まれている場合にのみ、 に を
fDeleteOld
指定true
します。別のインスタンスをメモリ ブロックにコピーし、オブジェクトに参照型が含まれている場合は、
fDeleteOld
古い内容の参照型を解放する 必要がありますtrue
。オブジェクトに参照型が含まれている場合は、メモリ ブロックを解放する DestroyStructure 前に メソッドを呼び出す必要があります。
注意
既存の構造体をコピーする代わりにピン留めするには、 型を System.Runtime.InteropServices.GCHandle 使用して構造体のピン留めされたハンドルを作成します。 ピン留めする方法の詳細については、「 コピーとピン留め」を参照してください。
こちらもご覧ください
適用対象
.NET