다음을 통해 공유


Marshal.StructureToPtr 메서드

정의

오버로드

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

이 메서드가 데이터를 복사하기 전에 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 boxed 또는 unboxed일 수 있습니다. boxed인 경우 복사하기 전에 받은 편지함이 해제됩니다.

형식이 지정된 클래스는 특성에 의해 StructLayoutAttribute 레이아웃이 또는 LayoutKind.SequentialLayoutKind.Explicit 지정된 참조 형식입니다.

StructureToPtr 는 의 내용을 structure 매개 변수가 가리키는 미리 할당된 메모리 블록에 ptr 복사합니다. COM 인터페이스 포인터(인터페이스, 레이아웃이 없는 클래스 및 System.Object)에 마샬링하는 참조 형식이 포함된 경우 structure 관리되는 개체는 참조 횟수로 활성 상태로 유지됩니다. 다른 모든 참조 형식(예: 문자열 및 배열)은 복사본으로 마샬링됩니다. 관리되는 개체나 관리되지 않는 개체를 해제하려면 메모리 블록을 해제하기 전에 메서드를 호출 Marshal.DestroyStructure 해야 합니다.

메서드를 StructureToPtr 사용하여 나중에 메모리 블록에 다른 인스턴스를 복사하는 경우 를 지정 truefDeleteOld 하여 이전 인스턴스의 참조 형식에 대한 참조 수를 제거합니다. 그렇지 않으면 관리되는 참조 형식 및 관리되지 않는 복사본이 효과적으로 유출됩니다.

사용에 StructureToPtr 대한 전체 패턴은 다음과 같습니다.

  1. 메모리 블록이 할당된 fDeleteOld 후 메서드에 StructureToPtr 대한 첫 번째 호출에서는 지울 내용이 없으므로 이어야 false합니다.

    중요

    블록에 fDeleteOld 유효한 데이터가 포함된 경우에만 을 지정 true 합니다.

  2. 다른 인스턴스를 메모리 블록에 복사하고 개체에 참조 형식이 포함된 경우 이전 콘텐츠에서 참조 형식 fDeleteOld 을 해제하려면 여야 true 합니다.

  3. 개체에 참조 형식이 포함된 경우 메모리 블록을 해제하기 전에 메서드를 호출 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

이 메서드가 데이터를 복사하기 전에 ptr 매개 변수에 대해 DestroyStructure<T>(IntPtr) 메서드를 호출하려면 true입니다. 블록에는 유효한 데이터가 있어야 합니다. 메모리 블록에 이미 데이터가 포함되어 있을 때 false를 전달하면 메모리 누수가 발생할 수 있습니다.

특성

예외

structure가 형식이 지정된 클래스가 아닌 참조 형식인 경우

설명

형식이 지정된 클래스는 특성에 의해 StructLayoutAttribute 레이아웃이 또는 LayoutKind.SequentialLayoutKind.Explicit 지정된 참조 형식입니다.

StructureToPtr<T>(T, IntPtr, Boolean) 는 의 내용을 structure 매개 변수가 가리키는 미리 할당된 메모리 블록에 ptr 복사합니다. COM 인터페이스 포인터(인터페이스, 레이아웃이 없는 클래스 및 System.Object)에 마샬링하는 참조 형식이 포함된 경우 structure 관리되는 개체는 참조 횟수로 활성 상태로 유지됩니다. 다른 모든 참조 형식(예: 문자열 및 배열)은 복사본으로 마샬링됩니다. 관리되는 개체나 관리되지 않는 개체를 해제하려면 메모리 블록을 해제하기 전에 메서드를 호출 DestroyStructure<T>(IntPtr) 해야 합니다.

메서드를 StructureToPtr<T>(T, IntPtr, Boolean) 사용하여 나중에 메모리 블록에 다른 인스턴스를 복사하는 경우 를 지정 truefDeleteOld 하여 이전 인스턴스의 참조 형식에 대한 참조 수를 제거합니다. 그렇지 않으면 관리되는 참조 형식 및 관리되지 않는 복사본이 효과적으로 유출됩니다.

사용에 StructureToPtr<T>(T, IntPtr, Boolean) 대한 전체 패턴은 다음과 같습니다.

  1. 메모리 블록이 할당된 fDeleteOld 후 메서드에 StructureToPtr 대한 첫 번째 호출에서는 지울 내용이 없으므로 이어야 false합니다.

    중요

    블록에 fDeleteOld 유효한 데이터가 포함된 경우에만 을 지정 true 합니다.

  2. 다른 인스턴스를 메모리 블록에 복사하고 개체에 참조 형식이 포함된 경우 이전 콘텐츠에서 참조 형식 fDeleteOld 을 해제하려면 여야 true 합니다.

  3. 개체에 참조 형식이 포함된 경우 메모리 블록을 해제하기 전에 메서드를 호출 DestroyStructure 해야 합니다.

참고

기존 구조를 복사하는 대신 고정하려면 형식을 System.Runtime.InteropServices.GCHandle 사용하여 구조체에 대해 고정된 핸들을 만듭니다. 고정하는 방법에 대한 자세한 내용은 복사 및 고정을 참조하세요.

추가 정보

적용 대상