Marshal.StructureToPtr 메서드

정의

오버로드

StructureToPtr(Object, IntPtr, Boolean)
사용되지 않습니다.

관리되는 개체의 데이터를 관리되지 않는 메모리 블록으로 마샬링합니다.Marshals data from a managed object to an unmanaged block of memory.

StructureToPtr<T>(T, IntPtr, Boolean)

[.NET Framework 4.5.1 이상 버전에서 지원됨][Supported in the .NET Framework 4.5.1 and later versions]

지정된 형식의 관리되는 개체의 데이터를 관리되지 않는 메모리 블록으로 마샬링합니다.Marshals data from a managed object of a specified type to an unmanaged block of memory.

StructureToPtr(Object, IntPtr, Boolean)

주의

StructureToPtr(Object, IntPtr, Boolean) may be unavailable in future releases. Instead, use StructureToPtr(T, IntPtr, Boolean). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296516

관리되는 개체의 데이터를 관리되지 않는 메모리 블록으로 마샬링합니다.Marshals data from a managed object to an unmanaged block of memory.

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

마샬링될 데이터가 있는 관리되는 개체입니다.A managed object that holds the data to be marshaled. 이 개체는 구조체이거나 형식이 지정된 클래스의 인스턴스여야 합니다.This object must be a structure or an instance of a formatted class.

ptr
IntPtr

관리되지 않는 메모리 블록에 대한 포인터로서 이 메서드가 호출되기 전에 할당되어야 합니다.A pointer to an unmanaged block of memory, which must be allocated before this method is called.

fDeleteOld
Boolean

이 메서드가 데이터를 복사하기 전에 ptr 매개 변수에 대해 DestroyStructure(IntPtr, Type) 메서드를 호출하려면 true입니다.true to call the DestroyStructure(IntPtr, Type) method on the ptr parameter before this method copies the data. 블록에는 유효한 데이터가 있어야 합니다.The block must contain valid data. 메모리 블록에 이미 데이터가 포함되어 있을 때 false를 전달하면 메모리 누수가 발생할 수 있습니다.Note that passing false when the memory block already contains data can lead to a memory leak.

특성

예외

structure가 형식이 지정된 클래스가 아닌 참조 형식인 경우structure is a reference type that is not a formatted class.

또는-or- structure은 제네릭 형식(.NET Framework 4.5 및 이전 버전에만 해당)의 인스턴스입니다.structure is an instance of a generic type (in the .NET Framework 4.5 and earlier versions only).

예제

다음 예제에서는 관리 되는 구조체를 만들고 메서드를 사용 하 여 관리 되지 않는 메모리에 전달한 StructureToPtr 다음 메서드를 사용 하 여 관리 되는 메모리로 다시 전송 합니다 PtrToStructure .The following example creates a managed structure, transfers it to unmanaged memory using the StructureToPtr method, and then transfers it back to managed memory using the PtrToStructure method.

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이 값 형식인 경우 boxed 또는 unboxed 일 수 있습니다.If structure is a value type, it can be boxed or unboxed. Boxed 이면 복사 하기 전에 unboxing 됩니다.If it is boxed, it is unboxed before copying.

형식이 지정 된 클래스는 레이아웃을 특성으로 지정 하는 참조 형식 StructLayoutAttribute 으로 LayoutKind.Explicit 또는 LayoutKind.Sequential 입니다.A formatted class is a reference type whose layout is specified by the StructLayoutAttribute attribute, as either LayoutKind.Explicit or LayoutKind.Sequential.

StructureToPtr 의 내용을 structure 매개 변수가 가리키는 메모리의 미리 할당 된 블록에 복사 합니다 ptr .StructureToPtr copies the contents of structure to the pre-allocated block of memory that the ptr parameter points to. structure에 COM 인터페이스 포인터 (인터페이스, 레이아웃 없는 클래스 및)로 마샬링하는 참조 형식이 포함 된 경우 System.Object 관리 되는 개체는 참조 횟수를 사용 하 여 활성 상태로 유지 됩니다.If structure contains reference types that marshal to COM interface pointers (interfaces, classes without layout, and System.Object), the managed objects are kept alive with reference counts. 다른 모든 참조 형식 (예: 문자열 및 배열)은 복사본으로 마샬링됩니다.All other reference types (for example, strings and arrays) are marshaled to copies. 이러한 관리 되거나 관리 되지 않는 개체를 해제 하려면 Marshal.DestroyStructure 메모리 블록을 해제 하기 전에 메서드를 호출 해야 합니다.To release these managed or unmanaged objects, you must call the Marshal.DestroyStructure method before you free the memory block.

메서드를 사용 하 여 StructureToPtr 다른 인스턴스를 메모리 블록에 나중에 복사 하는 경우에는를 true 지정 fDeleteOld 하 여 이전 인스턴스의 참조 형식에 대 한 참조 횟수를 제거 합니다.If you use the StructureToPtr method to copy a different instance to the memory block at a later time, specify true for fDeleteOld to remove reference counts for reference types in the previous instance. 그렇지 않으면 관리 되는 참조 형식 및 관리 되지 않는 복사본이 효과적으로 누출 됩니다.Otherwise, the managed reference types and unmanaged copies are effectively leaked.

를 사용 하는 전체 패턴은 다음과 같습니다 StructureToPtr .The overall pattern for using StructureToPtr is as follows:

  1. StructureToPtr메모리 블록을 할당 한 후 메서드를 처음 호출할 때는 지울 내용이 없으므로은 이어야 fDeleteOld 합니다 false .On the first call to the StructureToPtr method after a memory block has been allocated, fDeleteOld must be false, because there are no contents to clear.

    중요

    true블록에 fDeleteOld 유효한 데이터가 포함 된 경우에만를 지정 합니다.Specify true for fDeleteOld only if the block contains valid data.

  2. 다른 인스턴스를 메모리 블록에 복사 하 고 개체에 참조 형식이 포함 된 경우는 fDeleteOld true 이전 콘텐츠에서 참조 형식을 해제 해야 합니다.If you copy a different instance to the memory block, and the object contains reference types, fDeleteOld must be true to free reference types in the old contents.

  3. 개체에 참조 형식이 포함 된 경우에는 DestroyStructure 메모리 블록을 해제 하기 전에 메서드를 호출 해야 합니다.If the object contains reference types, you must call the DestroyStructure method before you free the memory block.

참고

기존 구조를 복사 하는 대신 고정 하려면 해당 형식을 사용 System.Runtime.InteropServices.GCHandle 하 여 구조체에 대 한 고정 된 핸들을 만듭니다.To pin an existing structure instead of copying it, use the System.Runtime.InteropServices.GCHandle type to create a pinned handle for the structure. 고정 방법에 대 한 자세한 내용은 복사 및 고정을 참조 하세요.For details on how to pin, see Copying and Pinning.

추가 정보

적용 대상

StructureToPtr<T>(T, IntPtr, Boolean)

[.NET Framework 4.5.1 이상 버전에서 지원됨][Supported in the .NET Framework 4.5.1 and later versions]

지정된 형식의 관리되는 개체의 데이터를 관리되지 않는 메모리 블록으로 마샬링합니다.Marshals data from a managed object of a specified type to an unmanaged block of memory.

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

관리되는 개체의 형식입니다.The type of the managed object.

매개 변수

structure
T

마샬링될 데이터가 있는 관리되는 개체입니다.A managed object that holds the data to be marshaled. 이 개체는 구조체이거나 형식이 지정된 클래스의 인스턴스여야 합니다.The object must be a structure or an instance of a formatted class.

ptr
IntPtr

관리되지 않는 메모리 블록에 대한 포인터로서 이 메서드가 호출되기 전에 할당되어야 합니다.A pointer to an unmanaged block of memory, which must be allocated before this method is called.

fDeleteOld
Boolean

이 메서드가 데이터를 복사하기 전에 ptr 매개 변수에 대해 DestroyStructure<T>(IntPtr) 메서드를 호출하려면 true입니다.true to call the DestroyStructure<T>(IntPtr) method on the ptr parameter before this method copies the data. 블록에는 유효한 데이터가 있어야 합니다.The block must contain valid data. 메모리 블록에 이미 데이터가 포함되어 있을 때 false를 전달하면 메모리 누수가 발생할 수 있습니다.Note that passing false when the memory block already contains data can lead to a memory leak.

특성

예외

structure가 형식이 지정된 클래스가 아닌 참조 형식인 경우structure is a reference type that is not a formatted class.

설명

형식이 지정 된 클래스는 레이아웃을 특성으로 지정 하는 참조 형식 StructLayoutAttribute 으로 LayoutKind.Explicit 또는 LayoutKind.Sequential 입니다.A formatted class is a reference type whose layout is specified by the StructLayoutAttribute attribute, as either LayoutKind.Explicit or LayoutKind.Sequential.

StructureToPtr<T>(T, IntPtr, Boolean) 의 내용을 structure 매개 변수가 가리키는 메모리의 미리 할당 된 블록에 복사 합니다 ptr .StructureToPtr<T>(T, IntPtr, Boolean) copies the contents of structure to the pre-allocated block of memory that the ptr parameter points to. structure에 COM 인터페이스 포인터 (인터페이스, 레이아웃 없는 클래스 및)로 마샬링하는 참조 형식이 포함 된 경우 System.Object 관리 되는 개체는 참조 횟수를 사용 하 여 활성 상태로 유지 됩니다.If structure contains reference types that marshal to COM interface pointers (interfaces, classes without layout, and System.Object), the managed objects are kept alive with reference counts. 다른 모든 참조 형식 (예: 문자열 및 배열)은 복사본으로 마샬링됩니다.All other reference types (for example, strings and arrays) are marshaled to copies. 이러한 관리 되거나 관리 되지 않는 개체를 해제 하려면 DestroyStructure<T>(IntPtr) 메모리 블록을 해제 하기 전에 메서드를 호출 해야 합니다.To release these managed or unmanaged objects, you must call the DestroyStructure<T>(IntPtr) method before you free the memory block.

메서드를 사용 하 여 StructureToPtr<T>(T, IntPtr, Boolean) 다른 인스턴스를 메모리 블록에 나중에 복사 하는 경우에는를 true 지정 fDeleteOld 하 여 이전 인스턴스의 참조 형식에 대 한 참조 횟수를 제거 합니다.If you use the StructureToPtr<T>(T, IntPtr, Boolean) method to copy a different instance to the memory block at a later time, specify true for fDeleteOld to remove reference counts for reference types in the previous instance. 그렇지 않으면 관리 되는 참조 형식 및 관리 되지 않는 복사본이 효과적으로 누출 됩니다.Otherwise, the managed reference types and unmanaged copies are effectively leaked.

를 사용 하는 전체 패턴은 다음과 같습니다 StructureToPtr<T>(T, IntPtr, Boolean) .The overall pattern for using StructureToPtr<T>(T, IntPtr, Boolean) is as follows:

  1. StructureToPtr메모리 블록을 할당 한 후 메서드를 처음 호출할 때는 지울 내용이 없으므로은 이어야 fDeleteOld 합니다 false .On the first call to the StructureToPtr method after a memory block has been allocated, fDeleteOld must be false, because there are no contents to clear.

    중요

    true블록에 fDeleteOld 유효한 데이터가 포함 된 경우에만를 지정 합니다.Specify true for fDeleteOld only if the block contains valid data.

  2. 다른 인스턴스를 메모리 블록에 복사 하 고 개체에 참조 형식이 포함 된 경우는 fDeleteOld true 이전 콘텐츠에서 참조 형식을 해제 해야 합니다.If you copy a different instance to the memory block, and the object contains reference types, fDeleteOld must be true to free reference types in the old contents.

  3. 개체에 참조 형식이 포함 된 경우에는 DestroyStructure 메모리 블록을 해제 하기 전에 메서드를 호출 해야 합니다.If the object contains reference types, you must call the DestroyStructure method before you free the memory block.

참고

기존 구조를 복사 하는 대신 고정 하려면 해당 형식을 사용 System.Runtime.InteropServices.GCHandle 하 여 구조체에 대 한 고정 된 핸들을 만듭니다.To pin an existing structure instead of copying it, use the System.Runtime.InteropServices.GCHandle type to create a pinned handle for the structure. 고정 방법에 대 한 자세한 내용은 복사 및 고정을 참조 하세요.For details on how to pin, see Copying and Pinning.

추가 정보

적용 대상